Tomcat HTTPS密钥库证书

xdnvmnnf  于 2022-11-24  发布在  其他
关注(0)|答案(4)|浏览(199)

使用SSL和Tomcat时遇到另一个问题:我已经配置了一个包含密钥和证书的keystore(我希望向连接到站点的客户端提供的服务器证书),我也对truststore做了同样的操作(我将需要客户端身份验证)。
我现在遇到的问题是,当我通过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

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

v09wglhw

v09wglhw1#

问题是(显然-我不能真正确认这一点),不可能正确地将以前生成的证书(和匹配的密钥)导入到JKS密钥库中,并由Tomcat正确地显示它。
出现问题的情况如下:
1.我有一个证书文件,它是我自己使用OpenSSL从头开始生成的(密钥+ CSR -〉证书),由我自己的CA签名。
1.我希望配置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
1.使用自定义Java类将两个DER文件导入到密钥库(JKS文件)中。
java ImportKey my_private_key.der my_certificate.der
我自己也没有弄清楚这一点(所有的功劳都要归功于最初的发明者)。这个Java类的源代码和一些更多的细节可以在herehere中找到。我稍微修改了这个类,这样就有了第三个(或第四个)参数来指定生成的JKS文件的输出位置。
最后的结果是一个JKS密钥库,它可以在Tomcat连接器配置中作为密钥库使用。上面的工具将为密钥和JKS文件本身生成一个带有默认密码的JKS文件,这些可以在以后使用keytool -storepasswdkeytool -keypasswd进行更改。希望这对面临同样问题的人有所帮助。

agyaoht7

agyaoht72#

您的配置应该可以正常工作。
Tomcat's how-to说明了为获得正确的JKS而应采取的步骤。
确保您已将证书导入到jks,并使用适当的别名(testKey)

okxuctiv

okxuctiv3#

@博周评论展开,
这真的很关键。“密钥和购买的证书将使用相同的别名”
从CA(Verisign、Digicert等)购买的SSL证书应使用与创建csr之前生成的私钥相同的别名导入。使用java keytool将购买的证书导入密钥库后,您将看到**“Certificate reply added to keystore”。**
要检查信任链,请使用终端命令**openssl s_client -connect yourdomain.com:443-showcerts。**它从您的证书开始,一直到受信任的根CA。

atmip9wb

atmip9wb4#

以下是为密钥库生成正确证书条目的命令。背景知识:从Tomcat版本7开始,Tomcat支持PKCS 12作为密钥库格式,java密钥库可以轻松导入此类文件。更多背景知识:密钥库中的密钥条目要求存在整个证书链,否则将发生SSL错误。
因此,以下是该做的事情:
1.将中间(签名根)证书和根CA证书连接在一起:
猫中间体.pem根.pem〉链.pem
1.将您的签名证书与链连接:
目录证书.pem链.pem〉全链.pem
1.现在,创建一个pkcs 12文件,其中包含完整的链,并清楚地标识了根。确保复制使用CSR生成的私钥(在我的示例中命名为privkey.pem),该私钥与执行以下命令时生成的其他文件位于同一目录中:
openssl pkcs 12-导出-输入完整链。pem -输入密钥私钥。pem -输出密钥库。p12-名称服务器-CA文件链。pem -caname root
1.好吧,酷;这个文件应该可以正常工作。2你可以把它复制到conf/ssl中,然后修改server.xml,使用keystore.p12代替keystore. jks。3或者,你可以把它导入到你的密钥库文件中,方法是cding到conf/ssl中,然后运行下面的命令(也许先做一个备份):
keytool -导入密钥库-目标密钥库密钥库.jks -目标存储类型JKS -源密钥库密钥库. p12-源存储类型PKCS 12-别名服务器

相关问题