2011-11-14 49 views
24

我使用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

回答

6

最後我得到了它的工作。這不是一個乾淨的解決方案,但它的工作原理。我加入了中間證書到我的本地/ 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

12

我不得不通過查找發行者的根證書來創建一個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。重新運行上述並解決了問題。 –

5

它適用於我使用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" 
       /> 
5

甚至還有如一些意見要求(不含在/ 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] 
0

確保您OpenSSL的CA文件複製到中間文件。

在RHEL concat下面的文件到發行者ca文件。

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