Tomcat не предоставляет промежуточный сертификат (https)
Я создал ключ и консоль 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 [domain]: 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
Ответы
Ответ 1
Наконец, я начал работать. Это не чистое решение, но оно работает. Я добавил промежуточный сертификат к моим местным /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.
Ответ 2
Мне пришлось создать файл CA, найдя корневой сертификат для моего эмитента и затем помещая промежуточный сертификат над ним в тот же файл. Затем я побежал:
openssl pkcs12 -export -chain -inkey mykey.key -in mye.crt -name "tomcat" -CAfile intermediate_plus_root.crt -out key_and_cert.p12
Ответ 3
Он работает для меня с использованием 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"
/>
Ответ 4
Существует даже более простое решение, которое предлагается в некоторых комментариях (без сохранения корневых и промежуточных сертификатов в /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 как Heinzi, который уже полностью описан в его ответе:
keytool -importkeystore -deststorepass [password] -destkeystore keystore.jks -srckeystore key_and_cert.p12 -srcstoretype PKCS12 -srcstorepass [password]
Ответ 5
убедитесь, что вы скопировали файлы openssl ca в промежуточные файлы.
в RHEL введите следующий файл в файл вашего эмитента.
/etc/pki/tls/certs/ca-bundle.crt