tmb*_*gmn 19 java ssl https tomcat keystore
使用SSL和Tomcat进入另一个问题:我已经配置了一个密钥库,其中包含密钥和证书(我希望向连接到该站点的客户端提供的服务器证书).我为信任库做了同样的事情(我将需要客户端身份验证).
我现在的问题是,当我连接到通过HTTPS我的Tomcat实例,介绍给我(服务器证书)证书不是我的实际服务器证书,而是重点在JKS密钥库.使用-Djavax.net.debug = ssl显示它为客户端身份验证提供了正确的CA,但没有提供正确的服务器证书.
adding as trusted cert: Subject: CN=A Issuer: CN=A Algorithm: RSA; Serial number: - Valid from Tue Nov 10 14:48:31 CET 2009 until Mon Feb 08 14:48:31 CET 2010 adding as trusted cert: Subject: X Issuer: X Algorithm: RSA; Serial number: - Valid from Wed Jan 19 01:00:00 CET 2005 until Mon Jan 19 00:59:59 CET 2015
我用占位符取代了真正的价值观.A =服务器的域名(但在这种情况下,由于某种原因,这是密钥而不是证书).X = VeriSign CA(这应该是正确的).我有一个现有的证书,我想用它来呈现给客户端,我使用keytool将其导入JKS密钥库.
Tomcat连接器配置:
Connector port="444" protocol="HTTP/1.1" SSLEnabled="true" maxThreads="150" scheme="https" secure="true" clientAuth="false" sslProtocol="TLS" keystoreFile="conf/ssl/keystore.jks" keystorePass="xx" keyAlias="testkey" truststoreFile="conf/ssl/truststore.jks" truststorePass="xx"
知道为什么我的Tomcat实例没有提供正确的证书吗?
tmb*_*gmn 15
问题是(显然 - 我无法确认这一点),将先前生成的证书(和匹配密钥)正确导入JKS密钥库并由Tomcat正确呈现它是不可能的.
我的问题发生的情况如下:
我发现工作的解决方案是:
转换现有证书和其私钥的DER格式.例如(使用OpenSSL):
对于私钥 ;
openssl pkcs8 -topk8 -nocrypt -in my_private_key.key -inform PEM -out my_private_key.der -outform DER
对于实际签署的证书 ;
openssl x509 -in my_certificate.crt -inform PEM -out my_certificate.der -outform DER
使用自定义Java类将两个DER文件导入密钥库(JKS文件).
java ImportKey my_private_key.der my_certificate.der
我自己并没有想到这一点(所有功劳都归功于原始发明者).这个Java类的源代码以及更多细节可以在这里和这里找到.我稍微修改了这个类,以便有一个第3(或第4)参数指定生成的JKS文件的输出位置.
最终结果是一个JKS密钥库,然后可以在Tomcat Connector配置中用作密钥库.上面的工具将生成带有密钥和JKS文件本身的默认密码的JKS文件,稍后可以使用keytool -storepasswd和更改这些密码keytool -keypasswd.希望这对面临同样问题的人有所帮助.