2011-11-14 27 views
24

Tôi đã tạo khóa và csr trên bảng điều khiển, sử dụng tệp thực thi openssl. Sau đó, tôi đã gửi csr đến một CA và nhận lại chứng chỉ. Bây giờ tôi muốn nhập nó vào tomcat.tomcat không cung cấp chứng chỉ trung gian (https)

Vì vậy, tôi đã tạo ra một tập tin PKCS # 12 trong số chìa khóa của tôi và giấy chứng nhận của tôi:

openssl pkcs12 -export -in mycert.cert -inkey mykey.pem -out key_and_cert.p12 

và sau đó tạo ra một keystore chứa nó:

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

Sau đó, tôi nhập chuỗi chứng chỉ trung gian. crt:

keytool -import -trustcacerts -alias root -file chain.crt -keystore keystore.jks 

Đây là đầu ra của "keytool -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] 

Các server.xml tomcat chứa:

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

Khi tôi khởi động lại tomcat, nó có thể ghi không có lỗi trong catalina.out, mọi thứ có vẻ là ok. Nhưng khi tôi chạy firefox, nó báo cáo

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

Chạy "openssl s_client -connect [miền]: 443 -showcerts" trả

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) 
--- 

Tôi nghĩ tomcat không cung cấp chứng chỉ trung gian mặc dù nó biết rồi. Tôi có thể làm gì để làm cho tomcat mang nó?

Thông tin bổ sung: Khi nhập chứng chỉ pkcs12, không có lỗi chuỗi chứng chỉ vì lệnh -importkeystore không kiểm tra chuỗi. Tôi cũng đã cố gắng nhập chứng chỉ trung gian trước rồi gọi -importkeystore. Tôi nhận được kết quả tương tự.

chỉnh sửa: Tôi chỉ cố gắng một cách khác bằng cách chèn chuỗi trực tiếp trong PKCS # 12 chứng chỉ và nhận được lỗi sau:

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

Nhưng giấy chứng nhận chuỗi là ok:

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

bạn có CA gốc trong chuỗi PEM không? – njzk2

+0

điều gì mang lại cho bạn "openssl verification -CAfile chain.pem mycert.cert"? – njzk2

Trả lời

6

Cuối cùng tôi đã làm việc đó. Nó không phải là một giải pháp sạch, nhưng nó hoạt động. Tôi thêm chứng chỉ trung gian để tôi local/etc/ssl/certs và sau đó được gọi

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

Kết quả là Giấy chứng nhận pkcs12 tôi chuyển đổi sang jks qua

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

tập tin kết quả này dường như làm việc bây giờ, tomcat cung cấp chuỗi chứng chỉ cũng cho các khách hàng không có chứng chỉ trung gian trong thư mục/etc/ssl/certs của họ. Nhưng tôi nghĩ rằng cũng phải có một cách mà không thay đổi/etc/ssl/certs.

+0

bạn sẽ tìm thấy một giải pháp sạch hơn cho điều này? Tôi có một vấn đề rất tương tự. – njzk2

+0

không may là không nhưng bạn có thể xóa chứng chỉ từ/etc/ssl/certs sau đó – Heinzi

+0

ok cảm ơn bạn về mẹo này (tôi thực sự đã kết thúc việc nhận ra chuỗi mà tôi đã cung cấp bằng cách nào đó chưa hoàn thành) – njzk2

12

Tôi phải tạo tệp CA bằng cách tìm chứng chỉ gốc cho tổ chức phát hành của mình và sau đó đặt chứng chỉ trung gian ở trên nó trong cùng một tệp.Sau đó, tôi chạy:

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

Tôi đã sử dụng phương pháp này nhưng gặp lỗi: "Lỗi không thể nhận được chứng chỉ nhà phát hành nhận chuỗi." Vì vậy, tôi đã làm theo một số lời khuyên tôi tìm thấy trên mạng và đã làm: cat PrimaryCA.pem /etc/ssl/certs/ca-certificates.crt SecondaryCA.pem> intermediate_plus_root.crt. chạy lại phần trên và giải quyết vấn đề. –

5

Nó hoạt động cho tôi khi sử dụng APR. Xem 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

Thậm chí còn có một giải pháp đơn giản hơn như yêu cầu trong một số ý kiến ​​(mà không lưu gốc và trung cấp trong các tập tin/etc/ssl/certs)

Đầu tiên sao chép tất cả các gốc cần thiết và giấy chứng nhận trung gian trong một thư mục (trong ví dụ của chúng tôi thư mục là '~/certs' và hai giấy chứng nhận của chúng tôi được đặt tên là 'PrimaryCA.pem' và 'SecondaryCA.pem'):

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

Then 'c_rehash' thư mục:

c_rehash ~/certs 

Bây giờ thư mục certs sẽ chứa hai liên kết mới có tên liên quan đến lược đồ sau {{hash-value}. {N} 'trong đó {hash-value} là giá trị băm 8 ký hiệu và {n} là một số nguyên. Nếu đó là trường hợp của bạn tiếp tục lệnh sau đó tạo ra đuôi .p12 bạn sử dụng '-CApath' thay vì đi theo con đường dài quanh sao chép các chứng chỉ cho/etc/ssl/certs:

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

Cuối cùng chuyển nó sang jks là Heinzi đã được mô tả một cách hoàn hảo trong câu trả lời của mình:

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

đảm bảo bạn sao chép tệp mở opensl vào tệp trung gian.

trên bản concel RHEL sau tệp cho tệp nhà phát hành của bạn.

/etc/pki/tls/certs/ca-bundle.crt 
Các vấn đề liên quan