雄猫 HTTPS 密钥库证书

2022-09-02 21:48:08

使用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密钥库中。

雄猫连接器配置:

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


答案 1

问题是(显然 - 我无法真正确认这一点)不可能将以前生成的证书(和匹配的密钥)正确导入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


答案 2

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

Tomcat的操作方法解释了为了拥有适当的JKS而要采取的步骤。

确保已将证书导入到 jks,并带有适当的别名 (testKey)