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
最后我得到了它的工作。这不是一个干净的解决方案,但它的工作原理。我加入了中间证书到我的本地/ 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的情况下也必须有一种方法。
我不得不通过查找发行者的根证书来创建一个CA文件,然后将它上面的中间证书放在同一个文件中。然后我跑:
openssl pkcs12 -export -chain -inkey mykey.key -in mye.crt -name "tomcat" -CAfile intermediate_plus_root.crt -out key_and_cert.p12
我使用这种方法,但得到一个错误:“错误无法获得颁发者证书获取链。”所以我遵循了我在网上找到的一些建议,并做到了: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
您是否在您的连锁PEM中拥有根CA? – njzk2
什么让你“openssl验证-CAfile chain.pem mycert.cert”? – njzk2