首页 文章

Tomcat HTTPS密钥库证书

提问于
浏览
19

使用SSL和Tomcat进入另一个问题:我已经配置了一个密钥库,其中包含密钥和证书(我希望向连接到该站点的客户端提供的服务器证书) . 我为信任库做了同样的事情(我将需要客户端身份验证) .

我现在遇到的问题是,当我通过HTTPS连接到我的Tomcat实例时,呈现给我的证书(服务器证书)不是我的实际服务器证书,而是JKS密钥库中的 key . 使用-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

我用占位符取代了真正的 Value 观 . 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实例没有提供正确的证书吗?

3 回答

  • 15

    问题是(显然 - 我无法确认这一点),将先前生成的证书(和匹配密钥)正确导入JKS密钥库并由Tomcat正确呈现它是不可能的 .

    我的问题发生的情况如下:

    • 我有一个证书文件,我是从头开始使用OpenSSL生成的(密钥CSR - >证书),由我自己的CA签名 .

    • 我希望配置Tomcat,以便它为连接到我的站点的用户提供 this particular certificate .

    我发现工作的解决方案是:

    • 将现有证书 and 的私钥转换为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类的源代码,以及更多细节可以在herehere找到 . 我稍微修改了这个类,以便有一个第3(或第4)参数指定生成的JKS文件的输出位置 .

    最终结果是一个JKS密钥库,然后可以在Tomcat Connector配置中用作密钥库 . 上面的工具将生成带有密钥和JKS文件本身的默认密码的JKS文件,稍后可以使用 keytool -storepasswdkeytool -keypasswd 更改这些密码 . 希望这对面临同样问题的人有所帮助 .

  • 3

    您的配置应该正常工作 .

    Tomcat's how-to解释了为获得合适的JKS而采取的步骤 .

    确保已使用适当的别名(testKey)将证书导入jks

  • 2

    扩展@Bozho评论,

    这非常重要 . "The key and the purchased certificate are to be under the same alias" .

    从CA(Verisign,Digicert等)购买的SSL证书应使用与创建csr之前生成的私钥相同的别名导入 . 使用java keytool将购买的证书导入密钥库后,您将看到 "Certificate reply added to keystore".

    要检查信任链,请使用terminal命令 openssl s_client -connect yourdomain.com:443 -showcerts. 它从您的证书开始,并通向最受信任的根CA.

相关问题