1.证书识别:
安全证书如下:
-----BEGIN CERTIFICATE----- ... ... ... -----END CERTIFICATE-----
普通私钥如下:-----BEGIN PRIVATE KEY----- ... ... ... -----END PRIVATE KEY-----
RSA 私钥如下:-----BEGIN RSA PRIVATE KEY----- ... ... ... -----END RSA PRIVATE KEY-----
一般使用安全证书和 RSA 私钥,普通私钥需要转化为 RSA 私钥。
2.含有私钥和公钥的证书转换为keystore:
最近接触的项目中用到HTTPS,并且申请了证书以及私钥,这一块接触的少 先整理出来,谨防以后忘记。因为是tomcat中配置的https,需要将证书转成keystore文件,通过openssl 先通过证书以及私钥文件生成p12证书,再通过JAVA的keytool 生成keystore文件
- 准备工作:上传证书和rsa私钥的key
- 申请的证书有证书链,可以右键以文本打开,把证书里的内容按从下至上的顺序复制到一个新建的文件里allinone.cer
- 将allinone.cer和payment.private.key上传至服务器当中
- 敲入以下命令,过程中会需要你输入两遍password,需要记住。输入完吼将会生成p12,具体参数命令可以自行百度,不过这个字面意思已经很直白了,就不做叙述
openssl pkcs12 -export -in /root/allinone.cer -inkey /root/payment.private.key -out /root/projectX.p12
通过上面步骤的命令,我们再将projectX.p12文件转为keystore
keytool -importkeystore -v -srckeystore /root/projectX.p12 -srcstoretype pkcs12 -srcstorepass changeit(p12刚输入的密码) -destkeystore /root/payment.keystore -deststoretype jks -deststorepass changeit(keystore密钥库的密码)
- 开始配置tomcat,编辑 $TOMCAT_HOME/conf/server.xml
- 找到https相关的配置,注意区分keystoreFile keystorePass大小写,否则会不生效,并且会提示找不到文件或者密码错误相关提示
- ps:p12的密码好像需要跟keystore密码一致,否则会报错,不知道是不是哪个环节出了问题
<Executor name="tomcatThreadPoolHttps" namePrefix="catalina-exec-https-" maxThreads="6000" minSpareThreads="100" maxIdleTime="120000" />
<Connector executor="tomcatThreadPoolHttps" port="8443" redirctPort="6064" protocol="org.apache.coyote.http11.Http11NioProtocol" SSLEnabled="true" maxHttpHeaderSize="8192" acceptCount="1000" enableLookups="false" scheme="https" secure="true"keystoreFile="/root/payment.keystore" keystorePass="changeit" clientAuth="false" sslProtocol="TLSv1.2" />
3.其他类型证书转换
3.1 cer或者crt转jks
keytool -import -trustcacerts -alias 别名名字 -file 证书名字.cer -keystore 导出证书名字.jks
keytool -import -trustcacerts -alias 别名名字,随便取 -file 证书名字.crt -keystore test2.jks
3.2 cer+pem 转jks
openssl pkcs12 -export -in CsssssD.cer(证书) -inkey UUUUUU.pem(private key) -out ./testP12.p12
keytool -importkeystore -v -srckeystore testP12.p12 -srcstoretype pkcs12 -srcstorepass password(密码) -destkeystore server.jks -deststoretype jks -deststorepass password(密码)
4.其他说明:
loadKeyMaterial()重载方法是加载客户端证书用的 loadTrustMaterial()重载方法是加载服务器端相关信息用的(我们就是使用 loadTrustMaterial(TrustStrategy trustStrategy) 方法自己实现了一个信任策略,不对服务器端的证书进行校验), 在生成HttpClient的时候,指定相应的 SSLSocketFactory,之后,使用这个HttpClient发送的GET请求和POST请求就自动地附加上了证书信息 如果我们只需要忽略掉对服务器端证书的验证,而不需要发送客户端证书信息,在构建SSLContext的时候,只需要 loadTrustMaterial() 不需要 loadKeyMaterial()
SSLContext sslcontext = SSLContexts.custom()
//忽略掉对服务器端证书的校验
.loadTrustMaterial(new TrustStrategy() {
@Override
public boolean isTrusted(X509Certificate[] chain, String authType) throws CertificateException {
return true;
}
})
//加载服务端提供的truststore(如果服务器提供truststore的话就不用忽略对服务器端证书的校验了)
//.loadTrustMaterial(new File("D:\\truststore.jks"), "123456".toCharArray(),
// new TrustSelfSignedStrategy())
.loadKeyMaterial(keyStore, "cmcc".toCharArray())
.build();
SSLConnectionSocketFactory sslConnectionSocketFactory = new SSLConnectionSocketFactory(
sslcontext,
new String[]{"TLSv1"},
null,
SSLConnectionSocketFactory.getDefaultHostnameVerifier());
CloseableHttpClient httpclient = HttpClients.custom()
.setSSLSocketFactory(sslConnectionSocketFactory)
.build();