使用SSL和Tomcat遇到另一个问题:我配置了一个密钥库,其中包含一个密钥和一个证书(我希望提供给连接到该站点的客户端的服务器证书)。我已经对信任库做了同样的事情(我将需要客户端身份验证)。
我现在的问题是,当我连接到通过HTTPS我的Tomcat实例,介绍给我(服务器证书)证书不是我的实际服务器证书,而是 重点 在JKS密钥库中。使用- Djavax.net.debug = ssl可以表明它为客户端身份验证提供了正确的CA,但没有提供正确的服务器证书。
添加为可信证书: 主题:CN = A 发行者:CN = A 算法:RSA;序列号: - 有效期从2009年11月10日星期二14:48:31到2010年2月8日星期一 添加为可信证书: 主题:X 发行人:X 算法:RSA;序列号: - 有效期从2005年1月19日星期三01:00:00 CET到2015年1月19日星期一01:00:59:59 CET
我已经用占位符替换了实际值。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实例未提供正确的证书吗?
问题是(显然-我无法真正确认这一点),不可能将先前生成的证书(和匹配的密钥)正确导入到JKS密钥库中,并由Tomcat正确提交。
我的问题发生的情况如下:
我发现可以使用的解决方案是:
为 私钥 ;
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 ImportKey my_private_key.der my_certificate.der
我自己没有弄清楚这一点(所有功劳都归于最初的发明者)。该Java类的源代码,以及更多详细信息,请参见此处和此处。我稍稍修改了此类,以便使用第3个(或第4个)参数指定生成的JKS文件的输出位置。
最终结果是一个JKS密钥库,然后可以在Tomcat连接器配置中将其用作密钥库。上面的工具将使用密钥和JKS文件本身的默认密码生成JKS文件,以后可以使用keytool -storepasswd和对其进行更改keytool -keypasswd。希望这对面临相同问题的人们有所帮助。
keytool -storepasswd
keytool -keypasswd