Tomcat не предоставляет промежуточный сертификат (https) - PullRequest
24 голосов
/ 14 ноября 2011

Я создал ключ и csr на консоли, используя исполняемый файл openssl. Затем я отправил 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":

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 -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. Я получил те же результаты.

редактирование: Я просто попробовал другой способ, вставив цепочку непосредственно в сертификат 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

Ответы [ 5 ]

12 голосов
/ 10 января 2012

Мне пришлось создать файл CA, найдя корневой сертификат для моего эмитента, а затем поместив промежуточный сертификат над ним в тот же файл. Тогда я побежал:

openssl pkcs12 -export -chain -inkey mykey.key -in mye.crt -name "tomcat" -CAfile intermediate_plus_root.crt -out key_and_cert.p12
7 голосов
/ 02 июля 2014

Существует даже более простое решение, о котором говорится в некоторых комментариях (без сохранения корневых и промежуточных сертификатов в / etc / ssl / certs)

Сначала скопируйте все необходимые корневые и промежуточные сертификаты в папку (в нашем примере это папка '~ / certs', а наши два сертификата названы '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 / 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]
6 голосов
/ 05 августа 2013

Это работает для меня, используя 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"
               />
6 голосов
/ 14 ноября 2011

Наконец-то у меня все заработало.Это не чистое решение, но оно работает.Я добавил промежуточный сертификат в свой локальный / etc / ssl / certs и затем вызвал

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

Полученный сертификат pkcs12, который я преобразовал в jks через

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

Этот полученный файл, кажется, работаеттеперь tomcat доставляет цепочку сертификатов также клиентам, у которых нет промежуточного сертификата в их каталоге / etc / ssl / certs.Но я думаю, что также должен быть способ без изменения /etc/ssl/certs.

0 голосов
/ 11 мая 2016

убедитесь, что вы копируете файлы openssl ca в промежуточные файлы.

на RHEL concat следующий файл в ваш файл ca издателя.

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