Tomcat 自定义签名证书生成与部署

1.SSL单向认证

1.关于JKS证书

生成CA签名证书keystore

keytool -genkey -alias twt_server -keyalg RSA -keystore twt_server.jks -validity 3600 -storepass 123456 

您的名字与姓氏是什么?  [Unknown]:  

您的组织单位名称是什么?  [Unknown]:  itian

您的组织名称是什么?  [Unknown]:  itian

您所在的城市或区域名称是什么?  [Unknown]:  北京

您所在的省/市/自治区名称是什么?  [Unknown]:  海淀

该单位的双字母国家/地区代码是什么?  [Unknown]:  cn

CN=zhang, OU=zhang, O=zhang, L=xian, ST=shanxi, C=cn是否正确?  [否]:  y

输入  的密钥口令    (如果和密钥库口令相同, 按回车):  

然后生成cer证书

keytool -export -alias twt_server  -file twt_server.cer -keystore twt_server.jks -storepass 123456
 

然后部署

或者我们新增一个新的服务







	




	


       	 	


		


			






这样访问,通过相应的url,如‍‍‍‍https就能访问了.

 

2.关于部署PKCS12证书

这里还有个问题,我们生成的证书实际上是JKS类型的证书,如果我们使用PKCS12证书如何部署呢,PKCS12是互联网标准,如果使用PKCS12,那么java可以更好地与其他语言通信。

JKS与PKCS12互相导入

p12(pfx) -> jks

keytool -importkeystore -srckeystore keystore.p12 -srcstoretype PKCS12 -deststoretype JKS -destkeystore keystore.jks

jks -> p12(pfx)

keytool -importkeystore -srckeystore keystore.jks -srcstoretype JKS
-deststoretype PKCS12 -destkeystore keystore.p12

从jks里面导出cert

keytool -export -alias cert0001 -keystore trust.jks -storepass 123456 -file cert0001.cer

将cert导入jks

keytool -import -v -alias cert001 -file cert001.cer -keystore trust.jks -storepass 123456 -noprompt

那么,我们可以配置如下

 

2.关于APR部署CA证书

APR可以提升Tomcat性能,那么APR的Connector如何配置SSL呢

注意,APR的CA证书需要通过openSSL生成

openssl genrsa -out rsa-private-key.pem 1024
openssl req -new -x509 -nodes -sha1 -days 365 -key rsa-private-key.pem -out self-signed-cert.crt

 

2.SSL双向认证

1.生成服务器证书库(为了测试,我把有效期改为1天)

keytool -genkey -alias ca_server -keyalg RSA -keystore ca_server.jks -validity 1 -storepass 123456 

注意:第一项提示姓名与姓氏时请输入你的 域名

1.生成客户端证书库(为了测试,我把有效期改为1天)

keytool -genkey -alias ca_client -keyalg RSA  -storetype PKCS12 -keystore ca_client.pfx -validity 1 -storepass 123456

客户端(客户端需要使用PKCS12的密钥,因此这里我们生成pfx密钥证书)

2.将客户端证书部分添加到服务端证书库(让服务器信任客户端

2.1.pkcs12不能直接导入服务器证书库,需要导出cer证书,将证书导入到证书库中

keytool -export -alias ca_client -keystore ca_client.pfx -storetype PKCS12 -storepass 123456  -rfc -file ca_client.cer

2.2然后将证书导入到服务端证书库中

keytool -import -v  -alias ca_client -file  ca_client.cer -keystore ca_server.jks

 

3.配置Connector

在这里,我们为了让服务端证书库和认证库不要使用同一个keystore,我们把ca_server.jks复制一份起名为ca_trust.jks

此时配置修改如下

 

4.使用浏览器访问出现限制

然后我们启动Tomcat,使用浏览器访问,发现不能访问。说明我们的设置已经生效了,那么想让浏览器能访问该如何做呢?

首先,我们需要安装我们的pfx证书,双击安装,存储区域位置请选择【个人】,否则浏览器依然无法访问!

然后我们访问浏览器,就会出现证书选择提示,选择确定,便能浏览网页了。

Tomcat 自定义签名证书生成与部署_第1张图片

5.Android双向认证

双向认证,以Android为例子,Android支持PKCS12,BKS,AndroidCAStore,AndroidKeyStore

Name Supported (API Levels)
AndroidCAStore 14+(推荐)
AndroidKeyStore 18+ (推荐)
BCPKCS12 1–8 (不建议考虑)
BKS 1+ 
BouncyCastle 1+ 
PKCS12 1+ (推荐,PKCS12是互联网标准)
PKCS12-DEF 1–8(不建议考虑)

我们这里用网上的代码,BKS做例子,当然,pkcs12可以参考 android https通过加载pfx证书获取数据

public void setCertificates(InputStream... certificates)
{    try
    {
        CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");
        KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
        keyStore.load(null);        int index = 0;        for (InputStream certificate : certificates)
        {
            String certificateAlias = Integer.toString(index++);
            keyStore.setCertificateEntry(certificateAlias, certificateFactory.generateCertificate(certificate));            try
            {                if (certificate != null)
                    certificate.close();
            } catch (IOException e)
            {
            }
        }

        SSLContext sslContext = SSLContext.getInstance("TLS");
        TrustManagerFactory trustManagerFactory = TrustManagerFactory.
                getInstance(TrustManagerFactory.getDefaultAlgorithm());
        trustManagerFactory.init(keyStore);        //初始化keystore
        KeyStore clientKeyStore = KeyStore.getInstance(KeyStore.getDefaultType());
        clientKeyStore.load(mContext.getAssets().open("ca_client.bks"), "123456".toCharArray());

        KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
        keyManagerFactory.init(clientKeyStore, "123456".toCharArray());

        sslContext.init(keyManagerFactory.getKeyManagers(), trustManagerFactory.getTrustManagers(), new SecureRandom());
        
       HttpsURLConnection.setDefaultSSLSocketFactory(sslContext.getSocketFactory());
                     
        HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() {
        
        @Override
        public boolean verify(String hostname, SSLSession sslsession) {
       
        if("localhost".equals(hostname)){  
            return true;  
        } else {  
            return false;  
        }  
      }
  });

    } catch (Exception e)
    {
        e.printStackTrace();
    } 

}

读取cer证书

CertificateFactory certificatefactory = CertificateFactory
				.getInstance("X.509");
		FileInputStream bais = new FileInputStream("srca.cer");
		X509Certificate Cert = (X509Certificate) certificatefactory
				.generateCertificate(bais);
		bais.close();
		System.out.println("版本号 " + Cert.getVersion());
		System.out.println("序列号 " + Cert.getSerialNumber().toString(16));
		System.out.println("全名 " + Cert.getSubjectDN());
		System.out.println("签发者全名n" + Cert.getIssuerDN());
		System.out.println("有效期起始日 " + Cert.getNotBefore());
		System.out.println("有效期截至日 " + Cert.getNotAfter());
		System.out.println("签名算法 " + Cert.getSigAlgName());
		byte[] sig = Cert.getSignature();
		System.out.println("签名:" + new BigInteger(sig).toString(16));
		PublicKey pk = Cert.getPublicKey();
		System.out.println("PublicKey:"
		+ Base64.getEncoder().encodeToString(pk.getEncoded()));

如果从密钥库读取

 String pass="080302";
 
          String alias="mykey";
 
          String name=".keystore";
 
          FileInputStream in=new FileInputStream(name);
 
          KeyStore ks=KeyStore.getInstance("JKS");           
 
          ks.load(in,pass.toCharArray());
 
          Certificate c=ks.getCertificate(alias);
 
          in.close();
 
         System.out.println(c.toString( ));

转载自:https://my.oschina.net/ososchina/blog/500973?p=1

你可能感兴趣的:(Tomcat)