tomcat不提供中间证书(https)

问题描述:

我使用openssl可执行文件在控制台上创建了一个密钥和一个csr。 然后我将csr发送给CA并拿回了证书。现在我想将它导入到tomcat中。tomcat不提供中间证书(https)

所以我创建了一个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 

这里的 “密钥工具-keystore keystore.jks -list” 的输出:

Keystore-Typ: JKS 
Keystore-Provider: SUN 

Ihr Keystore enthält 2 Einträge. 

root, 14.11.2011, trustedCertEntry, 
Zertifikatsfingerabdruck (MD5): [fingerprint] 
1, 14.11.2011, PrivateKeyEntry, 
Zertifikatsfingerabdruck (MD5): [fingerprint] 

将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]" /> 

当我重新启动Tomcat,它记录在catalina.out中没有错误,一切都似乎是确定。 但是,当我使用Firefox,它报告

[domain] uses an invalid security certificate. 
The certificate is not trusted because no issuer chain was provided. 
(Error code: sec_error_unknown_issuer) 

运行 “的OpenSSL的s_client.First -connect [域]:443个-showcerts” 返回

CONNECTED(00000003) 
depth=0 C = DE, OU = Domain Control Validated, CN = [domain] 
verify error:num=20:unable to get local issuer certificate 
verify return:1 
depth=0 C = DE, OU = Domain Control Validated, CN = [domain] 
verify error:num=27:certificate not trusted 
verify return:1 
depth=0 C = DE, OU = Domain Control Validated, CN = [domain] 
verify error:num=21:unable to verify the first certificate 
verify return:1 
--- 
Certificate chain 
0 s:/C=DE/OU=Domain Control Validated/CN=[domain] 
    i:/C=BE/O=GlobalSign nv-sa/CN=GlobalSign Domain Validation CA - G2 
-----BEGIN CERTIFICATE----- 
[certificate from mycert.cert] 
-----END CERTIFICATE----- 
--- 
Server certificate 
subject=/C=DE/OU=Domain Control Validated/CN=[domain] 
issuer=/C=BE/O=GlobalSign nv-sa/CN=GlobalSign Domain Validation CA - G2 
--- 
No client certificate CA names sent 
--- 
SSL handshake has read 1777 bytes and written 289 bytes 
--- 
New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES256-SHA 
Server public key is 2048 bit 
Secure Renegotiation IS supported 
Compression: NONE 
Expansion: NONE 
SSL-Session: 
    Protocol : SSLv3 
    Cipher : ECDHE-RSA-AES256-SHA 
    Session-ID: [session-id] 
    Session-ID-ctx: 
    Master-Key: [master-key] 
    Key-Arg : None 
    PSK identity: None 
    PSK identity hint: None 
    Start Time: 1321268519 
    Timeout : 7200 (sec) 
    Verify return code: 21 (unable to verify the first certificate) 
--- 

我认为Tomcat不提供虽然中间证书知道它。我能做些什么来让tomcat提供它?

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

编辑:

$ 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. 

但链证书是确定的: 我只是在PKCS#12证书直接插入链,并得到以下错误尝试另一种方式

$ openssl verify chain.pem 
chain.pem: OK 
+0

您是否在您的连锁PEM中拥有根CA? – njzk2

+0

什么让你“openssl验证-CAfile chain.pem mycert.cert”? – njzk2

最后我得到了它的工作。这不是一个干净的解决方案,但它的工作原理。我加入了中间证书到我的本地/ etc/SSL /证书,然后叫

openssl pkcs12 -export -in cert.pem -inkey key.key -out key_and_cert.p12 -chain 

产生的PKCS12证书我通过

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

此生成的文件,似乎现在的工作转换为JKS下,Tomcat提供证书链也适用于在其/ etc/ssl/certs目录中没有中间证书的客户端。 但我认为在不改变/ etc/ssl/certs的情况下也必须有一种方法。

+0

你会碰巧找到一个更清洁的解决方案吗?我有一个非常类似的问题。 – njzk2

+0

不幸的是,但你可以从/ etc/ssl/certs中删除证书 – Heinzi

+0

好的谢谢你的提示(我实际上最终意识到我给出的链是某种程度上不完整的) – njzk2

我不得不通过查找发行者的根证书来创建一个CA文件,然后将它上面的中间证书放在同一个文件中。然后我跑:

 
openssl pkcs12 -export -chain -inkey mykey.key -in mye.crt -name "tomcat" -CAfile intermediate_plus_root.crt -out key_and_cert.p12 
+3

我使用这种方法,但得到一个错误:“错误无法获得颁发者证书获取链。”所以我遵循了我在网上找到的一些建议,并做到了:cat primaryCA.pem /etc/ssl/certs/ca-certificates.crt SecondaryCA.pem> intermediate_plus_root.crt。重新运行上述并解决了问题。 –

它适用于我使用APR。见http://tomcat.apache.org/tomcat-7.0-doc/config/http.html#SSL_Support_-_APR/Native

<Connector port="3573" protocol="HTTP/1.1" SSLEnabled="true" 
       maxThreads="150" scheme="https" secure="true" 
       clientAuth="false" sslProtocol="TLS" 
       SSLCertificateFile="/my/pem/encoded/certificate/file" 
       SSLCertificateKeyFile="/my/pem/encoded/certificate/private_key" 
       SSLPassword="yourKeyFilePassword" 
       SSLCertificateChainFile="/my/pem/encoded/certificate/authorities/file" 
       /> 

甚至还有如一些意见要求(不含在/ etc/SSL /证书保存的根和中级证书)

首先复制所有需要的根和中级证书更简单的解决方案的文件夹中(在我们的例子中,文件夹是“〜/证书”和我们的两个证书被命名为“PrimaryCA.pem”和“SecondaryCA.pem”):

mkdir ~/certs 
mv PrimaryCA.pem ~/certs/PrimaryCA.pem 
mv SecondaryCA.pem ~/certs/SecondaryCA.pem 

然后“c_rehash”的文件夹:

c_rehash ~/certs 

现在,certs文件夹将包含两个与以下方案'{hash-value}。{n}'有关的新符号链接,其中{hash-value}是一个8符号散列值,{n}是一个整数。如果是这样的话你继续下面的命令使用的.p12“-CApath”,而不是去很长的路要走轮复制证书到/ etc/SSL /证书,其产生:

openssl pkcs12 -export -in cert.pem -inkey key.key -out key_and_cert.p12 -chain -CApath ~/certs 

最后将其转换为JKS作为Heinzi已经完全在他的回答中描述:

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