Собственно столкнулся с сабжем и что не получилось нормально настроить. Прочитал 100500 статей, но нигде толком не объясняется, как же таки нормально настроить tomcat и ssl.У меня есть
rootca.crt, intermediate.crt, server.crt, private.key
Везде, где видел в keystore добавляли только сертификаты, но не сам private key. Пока что частично получилось настроить так
$ openssl pkcs12 -export -in jira.example.net.crt -inkey jira.example.net.key > jira.example.net.p12$ keytool -importkeystore -srckeystore /opt/jira/jira.example.net.p12 -destkeystore /opt/jira/jira.jks -srcstoretype pkcs12
$ keytool -importcert -alias intermediateca -keystore /opt/jira/jira.jks -trustcacerts -file /opt/jira/sub.class1.server.ca.crt
$ keytool -importcert -alias rootca -keystore /opt/jira/jira.jks -trustcacerts -file /opt/jira/rootca.crt
В итоге получаю
$ keytool -list -keystore /opt/jira/jira.jks
Enter keystore password:Keystore type: JKS
Keystore provider: SUNYour keystore contains 3 entries
rootca, Jun 23, 2015, trustedCertEntry,
Certificate fingerprint (SHA1): 3E:2B:F7:F2:03:1B:96:F3:8C:E6:C4:D8:A8:5D:3E:2D:58:47:6A:0Fintermediateca, Jun 23, 2015, trustedCertEntry,
Certificate fingerprint (SHA1): F6:91:FC:87:EF:B3:13:53:54:22:5A:10:E1:27:E9:11:D1:C7:F8:CF1, Jun 23, 2015, PrivateKeyEntry,
Certificate fingerprint (SHA1): F2:CE:0D:6F:D7:71:DF:57:41:96:A9:48:EB:CA:6C:94:C9:C5:4E:F0
Затем в контейнере указываю jira.jks
<Connector port="8443" protocol="org.apache.coyote.http11.Http11Protocol"
maxHttpHeaderSize="8192" SSLEnabled="true"
maxThreads="150" minSpareThreads="25"
keystoreFile="/opt/jira/jira.jks" keystorePass="7654321" keystoreType="JKS"
enableLookups="false" disableUploadTimeout="true"
acceptCount="100" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS" useBodyEncodingForURI="true"
/>И вроде как работает, по крайней мере в проводнике, но если проверять из командной строки, то получаю
# openssl s_client -connect jira.example.net:8443
CONNECTED(00000003)
depth=0 C = UA, CN = jira.example.net, emailAddress = webmaster@example.net
verify error:num=20:unable to get local issuer certificate
verify return:1
depth=0 C = UA, CN = jira.example.net, emailAddress = webmaster@example.net
verify error:num=27:certificate not trusted
verify return:1
depth=0 C = UA, CN = jira.example.net, emailAddress = webmaster@example.net
verify error:num=21:unable to verify the first certificate
verify return:1
---
Certificate chain
0 s:/C=UA/CN=jira.example.net/emailAddress=webmaster@example.net
i:/C=IL/O=StartCom Ltd./OU=Secure Digital Certificate Signing/CN=StartCom Class 1 Primary Intermediate Server CA
---
Server certificate
-----BEGIN CERTIFICATE-----
MIIHKDCCBhCgAwIBAgIHBQAf14IL/TANBgkqhkiG9w0BAQsFADCBjDELMAkGA1UEЯ так понимаю, что я что то упускаю, но не могу понять что. По техническим причинам терминирование ssl нельзя вынести на apache/nginx/etc.
> #openssl s_client -connect jira.example.net:8443openssl s_client -connect jira.example.net:8443 -CApath /etc/ssl/certs/
> openssl s_client -connect jira.example.net:8443 -CApath /etc/ssl/certs/Та же ошибка
$ openssl s_client -connect jira.example.net:8443 -CApath /etc/ssl/certs/
CONNECTED(00000003)
depth=0 C = UA, CN = jira.example.net, emailAddress = webmaster@example.net
verify error:num=20:unable to get local issuer certificate
verify return:1
depth=0 C = UA, CN = jira.example.net, emailAddress = webmaster@example.net
verify error:num=27:certificate not trusted
verify return:1
depth=0 C = UA, CN = jira.example.net, emailAddress = webmaster@example.net
verify error:num=21:unable to verify the first certificate
verify return:1
---
...
...
...
subject=/C=UA/CN=jira.example.net/emailAddress=webmaster@example.net
issuer=/C=IL/O=StartCom Ltd./OU=Secure Digital Certificate Signing/CN=StartCom Class 1 Primary Intermediate Server CA
---
No client certificate CA names sent
Server Temp Key: ECDH, secp521r1, 521 bits
---
SSL handshake has read 2644 bytes and written 443 bytes
---
New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES128-GCM-SHA256
Server public key is 4096 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
SSL-Session:
Protocol : TLSv1.2
Cipher : ECDHE-RSA-AES128-GCM-SHA256
Session-ID: 558A79F79BD40FD46CC269070BDCD945723DD3ADBD95F3CD630CB907736F5BCF
Session-ID-ctx:
Master-Key: 098376A226B8CFDEE25E006435C7939754E4CD9C9FAA453228D4B8C3764C179983843DBD257144069E1C7B03969F132B
Key-Arg : None
Krb5 Principal: None
PSK identity: None
PSK identity hint: None
Start Time: 1435138551
Timeout : 300 (sec)
Verify return code: 21 (unable to verify the first certificate)
---Если пускать через апач, то таких проблем нет, даже без указания -CApath
$ openssl s_client -connect jira.example.net:443
CONNECTED(00000003)
depth=2 C = IL, O = StartCom Ltd., OU = Secure Digital Certificate Signing, CN = StartCom Certification Authority
verify return:1
depth=1 C = IL, O = StartCom Ltd., OU = Secure Digital Certificate Signing, CN = StartCom Class 1 Primary Intermediate Server CA
verify return:1
depth=0 C = UA, CN = jira.example.net, emailAddress = webmaster@example.net
verify return:1
---
>[оверквотинг удален]
>CONNECTED(00000003)
>depth=0 C = UA, CN = jira.example.net, emailAddress = webmaster@example.net
>verify error:num=20:unable to get local issuer certificate
>verify return:1
>depth=0 C = UA, CN = jira.example.net, emailAddress = webmaster@example.net
>verify error:num=27:certificate not trusted
>verify return:1
>depth=0 C = UA, CN = jira.example.net, emailAddress = webmaster@example.net
>verify error:num=21:unable to verify the first certificate
>verify return:1если не ошибаюсь, не может найти всю цепочку(chain) сертификатов, т.е где участвует промежуточный сертификат.
решалось объединением в цепочку СА и промежуточного сертификата и его импортом в keystore
гляньте:
https://stackoverflow.com/questions/8120690/tomcat-doesnt-de...
http://www.fourproc.com/2010/06/23/create-a-ssl-keystore-for...
> если не ошибаюсь, не может найти всю цепочку(chain) сертификатов, т.е где участвует
> промежуточный сертификат.похоже на то
> решалось объединением в цепочку СА и промежуточного сертификата и его импортом в
> keystoreно я импортировал и корневой и промежуточный сертификаты.
> гляньте:
> https://stackoverflow.com/questions/8120690/tomcat-doesnt-de...
> http://www.fourproc.com/2010/06/23/create-a-ssl-keystore-for...ok, посмотрю
> но я импортировал и корневой и промежуточный сертификаты.вы импортировали каждый сертификат по отдельности, а нужно чтобы в импортированном сертификаты была именно цепочка связанных сертификатов
В общем удалось победитьСоздаем цепочку. Порядок имеет значение! root -> intermediate -> server
$ cat rootca.crt > chain.pem
$ cat sub.class1.server.ca.crt >> chain.pem
$ cat jira.example.net.crt >> chain.pemhttps://answers.atlassian.com/questions/146659/unable-to-con...
Note: If root or intermediate certificates are necessary, they MUST be inserted into the keychain in the order root -> intermediate(s) -> domain
Проверяем
$ openssl verify chain.pem
chain.pem: OKЭкспортируем в pkcs12
$ openssl pkcs12 -export -in chain.pem -inkey jira.example.net.key > chain.p12
Enter Export Password:
Verifying - Enter Export Password:
Импортируем нашу цепочку и закрытый ключ и на их основе создаем свой keystore
$ keytool -importkeystore -srckeystore chain.p12 -destkeystore jira.jks -srcstoretype pkcs12
Enter destination keystore password:
Re-enter new password:
Enter source keystore password:
Entry for alias 1 successfully imported.
Import command completed: 1 entries successfully imported, 0 entries failed or cancelledПроверяем
$ keytool -list -keystore jira.jks
Enter keystore password:Keystore type: JKS
Keystore provider: SUNYour keystore contains 1 entry
1, Jun 24, 2015, PrivateKeyEntry,
Certificate fingerprint (SHA1): F2:CE:0D:6F:D7:71:DF:57:41:96:A9:48:EB:CA:6C:94:C9:C5:4E:F0После этого указываем файл jira.jks в описании контейнера
можно было сделать проще, отказаться от хранилища jks и прописать сертификаты в ручную, это описано здесь же на ресурсе через поиск найдете tomcat+ssl:<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
maxThreads="150" scheme="https" secure="true"
SSLCACertificateFile="${catalina.home}/cert/root.crt"
SSLCertificateFile="${catalina.home}/cert/client.crt"
SSLCertificateKeyFile="${catalina.home}/cert/client.key"
sslProtocol="TLS" />в root.crt все зависимые сертификаты.
можно было сделать проще, отказаться от хранилища jks и прописать сертификаты в ручную, это описано здесь же на ресурсе через поиск найдете tomcat+ssl:<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
maxThreads="150" scheme="https" secure="true"
SSLCACertificateFile="${catalina.home}/cert/root.crt"
SSLCertificateFile="${catalina.home}/cert/client.crt"
SSLCertificateKeyFile="${catalina.home}/cert/client.key"
sslProtocol="TLS" />в root.crt все зависимые сертификаты.
> можно было сделать проще, отказаться от хранилища jks и прописать сертификаты в
> ручную, это описано здесь же на ресурсе через поиск найдете tomcat+ssl:
> <Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
> maxThreads="150" scheme="https" secure="true"
> SSLCACertificateFile="${catalina.home}/cert/root.crt"
> SSLCertificateFile="${catalina.home}/cert/client.crt"
> SSLCertificateKeyFile="${catalina.home}/cert/client.key"
> sslProtocol="TLS" />
> в root.crt все зависимые сертификаты.Да, можно и так, но будет работать только с apr контейнером, что не всегда приемлемо
<Connector port="8443" protocol="org.apache.coyote.http11.Http11AprProtocol"
scheme="https"
secure="true"
clientAuth="false"
useBodyEncodingForURI="true"SSLEnabled="true"
SSLHonorCipherOrder="true"
SSLDisableCompression="true"
SSLCertificateFile="/etc/pki/jira/jira.example.net.crt"
SSLCertificateKeyFile="/etc/pki/jira/jira.example.net.key"
SSLCertificateChainFile="/etc/pki/jira/chain.crt"
SSLCipherSuite="ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!3DES:!MD5:!PSK"
SSLProtocol="TLSv1+TLSv1.1+TLSv1.2"/>C tomcat-7.0.57+ и tcnative-1.1.34 (пока что доступна только в транке) на ssllabs получается A
http://sys-adm.org.ua/www/jira-tomcat-sslсделал заметку, может кому пригодится