tomcat没有';t交付中间证书(https)

tomcat没有';t交付中间证书(https),tomcat,https,certificate,openssl,keystore,Tomcat,Https,Certificate,Openssl,Keystore,我使用openssl可执行文件在控制台上创建了一个密钥和csr。 然后,我将csr发送给CA并获得了证书。现在我想把它导入tomcat 因此,我用我的密钥和证书创建了一个PKCS#12文件: openssl pkcs12 -export -in mycert.cert -inkey mykey.pem -out key_and_cert.p12 然后创建了一个包含它的密钥库: keytool -importkeystore -deststorepass [password] -destkeys

我使用openssl可执行文件在控制台上创建了一个密钥和csr。 然后,我将csr发送给CA并获得了证书。现在我想把它导入tomcat

因此,我用我的密钥和证书创建了一个PKCS#12文件:

openssl pkcs12 -export -in mycert.cert -inkey mykey.pem -out key_and_cert.p12
然后创建了一个包含它的密钥库:

keytool -importkeystore -deststorepass [password] -destkeystore keystore.jks -srckeystore key_and_cert.p12 -srcstoretype PKCS12 -srcstorepass [password]
然后导入中间证书链.crt:

keytool -import -trustcacerts -alias root -file chain.crt -keystore keystore.jks
这里是“keytool-keystore keystore.jks-list”的输出:

tomcat server.xml包含:

<Connector port="443" protocol="HTTP/1.1" SSLEnabled="true"
           maxThreads="150" scheme="https" secure="true"
           clientAuth="false" URIEncoding="UTF-8" compression="on"
           sslProtocol="TLS"
           keystoreFile="/[absolute-path]/keystore.jks"
           keystorePass="[password]" />
运行“openssl s_客户端-连接[domain]:443-showcerts”返回

我认为tomcat不提供中间证书,尽管它知道。我该怎么做才能让tomcat交付

其他信息: 导入pkcs12证书时,没有证书链错误,因为-importkeystore命令不检查该链。我还尝试先导入中间证书,然后调用-importkeystore。我得到了同样的结果

编辑: 我只是尝试了另一种方法,将链直接插入PKCS#12证书中,得到以下错误:

$ openssl pkcs12 -export -CAfile chain.pem -in mycert.cert -inkey mykey.pem -out key_and_cert.p12 -name tomcat -chain
Error unable to get issuer certificate getting chain.
但是链证书是可以的:

$ openssl verify chain.pem
chain.pem: OK

我终于让它工作了。这不是一个干净的解决方案,但它是有效的。我将中间证书添加到本地/etc/ssl/certs,然后调用

openssl pkcs12 -export -in cert.pem -inkey key.key -out key_and_cert.p12 -chain
生成的pkcs12证书I通过

keytool -importkeystore -deststorepass [password] -destkeystore keystore.jks -srckeystore key_and_cert.p12 -srcstoretype PKCS12 -srcstorepass [password]
这个生成的文件现在似乎可以工作了,tomcat还将证书链交付给在其/etc/ssl/certs目录中没有中间证书的客户机。
但我认为也必须有一种不改变/etc/ssl/certs的方法。

我必须创建一个CA文件,找到我的颁发者的根证书,然后将其上面的中间证书放在同一个文件中。然后我跑:

openssl pkcs12 -export -chain -inkey mykey.key -in mye.crt -name "tomcat" -CAfile intermediate_plus_root.crt -out key_and_cert.p12 openssl pkcs12-export-chain-inkey mykey.key-in mye.crt-name“tomcat”-CAfile intermediate\u plus\u root.crt-out key\u and\u cert.p12
这对我来说很有用。看到了吗


有些评论甚至要求提供更简单的解决方案(不在/etc/ssl/certs中保存根证书和中间证书)

首先将所有需要的根证书和中间证书复制到文件夹中(在我们的示例中,文件夹为“~/certs”,我们的两个证书分别命名为“PrimaryCA.pem”和“SecondaryCA.pem”):

然后“c_rehash”文件夹:

c_rehash ~/certs
现在certs文件夹将包含两个新的符号链接,命名为以下方案“{hash value}.{n}”,其中{hash value}是一个8符号的哈希值,{n}是一个整数。如果是这种情况,请继续执行以下命令,该命令使用“-CApath”创建.p12,而不是将证书复制到/etc/ssl/certs:

openssl pkcs12 -export -in cert.pem -inkey key.key -out key_and_cert.p12 -chain -CApath ~/certs
最后将其转换为jks,正如他在回答中已经完美描述的:

keytool -importkeystore -deststorepass [password] -destkeystore keystore.jks -srckeystore key_and_cert.p12 -srcstoretype PKCS12 -srcstorepass [password]

确保将openssl ca文件复制到中间文件中

在RHEL concat上,将以下文件转换为您的发卡机构ca文件

/etc/pki/tls/certs/ca-bundle.crt

你有没有找到一个更干净的解决办法?我有一个非常类似的问题。不幸的是,不是这样,但您可以在/etc/ssl/certs中删除证书,也可以直接使用PKCS#12(.p12)文件作为Java中的密钥库:在Apache Tomcat连接器配置中使用
PKCS12
存储类型(
keystreType=“PKCS12”
)。请注意,openssl命令应在提示时提供导出密码,或者提供-passout参数,因为以下keytool命令不能与空白的srcstorepass一起使用。我发现我需要将
-certfile[intermediate cert]
添加到
pkcs12-export
命令中。通过这种方式,我获得了我自己的证书以及某些客户端所需的中间证书。您的链PEM中是否有根CA?是什么让您获得了“openssl验证-CAfile chain.PEM mycert.cert”?我使用了此方法,但出现了一个错误:“错误无法获取颁发者证书获取链。”因此,我按照我在网上找到的一些建议做了:cat PrimaryCA.pem/etc/ssl/certs/ca-certificates.crt SecondaryCA.pem>intermediate\u plus\u root.crt。重新运行上述操作,解决了问题。我想补充一点,您需要将P12文件中的证书重命名为“tomcat”。Iy里面有一个“1”的名字。从另一个方面,您可以指定它作为openssl的参数:
openssl pkcs12-export-name“tomcat”-在cert.pem-inkey-key.key-out-key和_cert.p12-chain-CApath~/certs
mkdir ~/certs
mv PrimaryCA.pem ~/certs/PrimaryCA.pem
mv SecondaryCA.pem ~/certs/SecondaryCA.pem
c_rehash ~/certs
openssl pkcs12 -export -in cert.pem -inkey key.key -out key_and_cert.p12 -chain -CApath ~/certs
keytool -importkeystore -deststorepass [password] -destkeystore keystore.jks -srckeystore key_and_cert.p12 -srcstoretype PKCS12 -srcstorepass [password]
/etc/pki/tls/certs/ca-bundle.crt