18

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

我现在遇到的问题是,当我通过 HTTPS 连接到我的 Tomcat 实例时,提供给我的证书(服务器证书)不是我的实际服务器证书,而是JKS密钥库中的密钥。使用 -Djavax.net.debug=ssl 表明它为客户端身份验证提供了正确的 CA,但不是正确的服务器证书。

添加为受信任的证书:
  主题:CN=A
  发行人:CN=A
  算法:RSA;序列号: -
  有效期为 2009 年 11 月 10 日星期二 14:48:31 CET 至 2010 年 2 月 8 日星期一 14:48:31 CET

添加为受信任的证书:
  主题:X
  发行人:X
  算法:RSA;序列号: -
  有效期为 2005 年 1 月 19 日星期三 01:00:00 CET 至 2015 年 1 月 19 日星期一 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 实例没有提供正确的证书吗?

4

3 回答 3

15

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

我的问题出现的情况如下:

  1. 我有一个证书文件,我使用 OpenSSL 从头开始​​生成(密钥 + CSR -> 证书),由我自己的 CA 签名。
  2. 我希望配置 Tomcat,以便它向连接到我的站点的用户提供这个特定的证书。

我发现可行的解决方案是:

  1. 将现有证书及其私钥转换为 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

  2. 使用自定义 Java 类将两个 DER 文件导入密钥库(JKS 文件)。

    java ImportKey my_private_key.der my_certificate.der

    我自己并没有弄清楚(所有功劳归于最初的发明者)。这个 Java 类的源代码,更多细节可以在这里这里找到。我稍微修改了这个类,以便有一个第三个(或第四个)参数来指定生成的 JKS 文件的输出位置。

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

于 2010-01-13T16:52:35.847 回答
3

您的配置应该可以正常工作。

Tomcat's how-to解释了为了获得正确的 JKS 所要采取的步骤。

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

于 2010-01-13T09:21:46.980 回答
2

扩展@Bozho 评论,

This was really critical. "The key and the purchased certificate are to be under the same alias".

The SSL certificate bought from the CA (Verisign, Digicert etc.) should be imported with the same alias as the private key generated before creating the csr. After importing the purchased certificate into the keystore using java keytool, you will see "Certificate reply added to keystore".

To check the trust chain, use the terminal command openssl s_client -connect yourdomain.com:443 -showcerts. It starts at your cert and leads to up to a trusted root CA.

于 2014-05-31T18:06:30.817 回答