Tomcat HTTPS密钥库证书

问题描述 投票:19回答:3

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

现在的问题是,当我通过HTTPS连接到Tomcat实例时,提供给我的证书(服务器证书)不是我的实际服务器证书,而是JKS密钥库中的key。使用-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到2015年1月19日星期一16:00(欧洲中部时间)

我已经用占位符替换了真实值。 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实例未提供正确的证书?

java tomcat ssl https keystore
3个回答
15
投票

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

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

  1. 我有一个证书文件,该文件由我自己的CA签署,是使用OpenSSL从头开始生成的(密钥+ CSR->证书)。
  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类的来源,以及更多详细信息,请参见herehere。我稍稍修改了此类,以便使用第3个(或第4个)参数指定生成的JKS文件的输出位置。

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


3
投票

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

Tomcat's how-to说明了拥有合适的JKS所要采取的步骤。

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


2
投票

扩展@Bozho评论,

© www.soinside.com 2019 - 2024. All rights reserved.