繁体   English   中英

Tomcat HTTPS 密钥库证书

[英]Tomcat HTTPS keystore certificate

使用 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 实例没有提供正确的证书吗?

问题是(显然 - 我无法真正确认这一点)无法将先前生成的证书(和匹配密钥)正确导入 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 -storepasswdkeytool -keypasswd更改这些密码。 希望这对面临同样问题的人有所帮助。

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

Tomcat 的 how-to解释了为了拥有合适的 JKS 需要采取的步骤。

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

扩展@Bozho 评论,

这真的很关键。 “密钥和购买的证书要在同一个别名下”

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

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

以下是为密钥库生成正确证书条目的命令。 背景知识:自Tomcat版本7开始,Tomcat支持PKCS12作为keystore格式,java keystores可以轻松导入此类文件。 更多背景知识:密钥库中的密钥条目要求存在整个证书链,否则将发生 SSL 错误。

所以这是该怎么做:

  1. 将您的中间(签名根)证书和您的根 CA 证书连接在一起:

    cat intermediate.pem root.pem > chain.pem

  2. 将您的签名证书与链连接起来:

    cat cert.pem chain.pem > fullchain.pem

  3. 现在,创建一个包含完整链的 pkcs12 文件,并明确标识根。 确保将您使用 CSR 生成的私钥(在我的示例中名为 privkey.pem)复制到与执行此命令时生成的其他文件相同的目录中:

    openssl pkcs12 -export -in fullchain.pem -inkey privkey.pem -out keystore.p12 -name server -CAfile chain.pem -caname root

  4. 好的,酷; 该文件应该可以正常工作。 您可以将其复制到 conf/ssl 并修改您的 server.xml 以使用 keystore.p12 而不是 keystore.jks。 或者,您可以通过 cding 到 conf/ssl 并运行此命令(可能先进行备份)将其导入到您的密钥库文件中:

    keytool -importkeystore -destkeystore keystore.jks -deststoretype JKS -srckeystore keystore.p12 -srcstoretype PKCS12 -别名服务器

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM