JRE7环境下从crt/key生成JKS及配置Tomcat7的问题
解决JRE7环境下生成JKS文件的错误及Tomcat7配置检查
一、正确生成JKS文件的步骤(规避parseAlgParameters错误)
你遇到的报错是因为JRE7的keytool对部分加密算法兼容性有限,直接处理第三方生成的PFX文件时容易触发问题。既然你手里有*.crt、*.key和*.ca-bundle文件,建议绕过中间PFX转换的坑,用OpenSSL+keytool组合生成兼容JRE7的JKS:
步骤1:用OpenSSL生成兼容的PKCS12文件
先把私钥、证书和CA根链打包成JRE7友好的PKCS12格式(OpenSSL生成的文件兼容性更强):
openssl pkcs12 -export -in 你的证书文件.crt -inkey 你的私钥文件.key -out temp.p12 -name myAlias -CAfile 你的CA根链文件.ca-bundle -caname root
执行时会提示设置PKCS12的密码,记好这个密码,后续转JKS要用到。
步骤2:用JRE7的keytool转成JKS文件
用JRE7自带的keytool把PKCS12转成JKS,命令如下:
keytool -importkeystore -srckeystore temp.p12 -srcstoretype PKCS12 -srcstorepass 你设置的PKCS12密码 -destkeystore local.jks -deststoretype JKS -deststorepass 你要设置的JKS密码 -destalias myAlias
注意:JKS密码建议和PKCS12密码保持一致,避免后续Tomcat配置出错;
-destalias要和步骤1的-name对应。
验证JKS文件有效性
生成后用以下命令检查JKS是否正常:
keytool -list -v -keystore local.jks -storepass 你的JKS密码
如果能看到完整的证书链、别名等信息,说明生成成功。
若必须用原有PFX文件的解决办法
如果你一定要用之前的mykey.pfx,需要:
- 安装JRE7的无限制权限策略文件(替换JRE7/lib/security下的
local_policy.jar和US_export_policy.jar),解决强加密算法支持问题; - 或者重新生成PFX时指定JRE7支持的加密算法,比如用3DES:
openssl pkcs12 -export -in yourcert.crt -inkey yourprivate.key -out mykey.pfx -name 1 -certfile yourca-bundle.crt -keypbe PBE-SHA1-3DES -certpbe PBE-SHA1-3DES -macalg SHA1
二、Tomcat7配置检查
你给出的Connector配置基本正确,但有几个细节可以优化:
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol" maxThreads="200" SSLEnabled="true" scheme="https" secure="true" clientAuth="false" sslProtocol="TLSv1.2" keystoreFile="conf\local.jks" keystorePass="mypass" sslEnabledProtocols="TLSv1.2" />
- 路径规范:
keystoreFile="conf\local.jks"是正确的,但建议改成正斜杠conf/local.jks,提升跨平台兼容性; - TLS版本配置:JRE7u95及以上默认支持TLSv1.2,若你的JRE7版本更低,需通过JVM参数
-Dhttps.protocols=TLSv1.2手动启用;另外sslProtocol="TLSv1.2"可改为sslProtocol="TLS",因为sslEnabledProtocols优先级更高,已经指定了TLSv1.2,这样写更规范; - 协议选择:
Http11NioProtocol是Tomcat7推荐的NIO协议,性能优于传统BIO,配置没问题。
修改后的推荐配置:
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol" maxThreads="200" SSLEnabled="true" scheme="https" secure="true" clientAuth="false" sslProtocol="TLS" keystoreFile="conf/local.jks" keystorePass="mypass" sslEnabledProtocols="TLSv1.2" />
内容的提问来源于stack exchange,提问作者Andrea P.
相关产品推荐
相关产品推荐

