Как отключить поддержку SSLv3 в Apache Tomcat?
Я пытаюсь перенастроить свой сервер Apache Tomcat, чтобы использовать только TLSv1. Тем не менее, он по-прежнему возвращается к SSLv3 с использованием определенных браузеров.
Я устанавливаю тег
<Connector ...
enableLookups="true" disableUploadTimeout="true"
acceptCount="100" maxThreads="200"
scheme="https" secure="true" SSLEnabled="true"
clientAuth="false" sslProtocol="TLS" ciphers="TLS_RSA_WITH_AES_128_CBC_SHA, TLS_DHE_RSA_WITH_AES_128_CBC_SHA, TLS_DHE_DSS_WITH_AES_128_CBC_SHA" sslEnabledProtocols="TLSv1" />
Я пропустил настройку конфигурации или у меня есть какой-то подарок, который мне не нужно было показывать?
8 ответов
В зависимости от версии Tomcat 5 и версии 6 SSLEnabled="true" может не работать, поскольку он был добавлен в середине выпуска. Чтобы обойти это, вам просто нужно отредактировать следующее: sslProtocols = TLS To: sslProtocols = "TLSv1,TLSv1.1,TLSv1.2"
Кажется странным, но несмотря на то, что он говорит TLS, он содержит SSL 3.
Это исправило это на нашем экземпляре Tomcat 5.5.20 и Tomcat 6. Грег
Я считаю, что вам нужно сделать это:
Jboss:
<Connector protocol="HTTP/1.1" SSLEnabled="true"
enableLookups="true" disableUploadTimeout="true"
acceptCount="100" maxThreads="200"
scheme="https" secure="true" clientAuth="false"
keystoreFile="${jboss.server.home.dir}/conf/keystore.jks"
keystorePass="rmi+ssl"
sslProtocols = "TLSv1,TLSv1.1,TLSv1.2" />
Не уверен в определении набора шифров, однако sslprotocols должен быть просто установлен в TLSv1, TLSv1.1, TLSv1.2
в зависимости от вашей версии Tomcat он будет отличаться, другие возможные решения:
Tomcat 5 и 6
<Connector...
enableLookups="true" disableUploadTimeout="true"
acceptCount="100" maxThreads="200" SSLEnabled="true" scheme="https" secure="true"
clientAuth="false" sslEnabledProtocols = "TLSv1,TLSv1.1,TLSv1.2" />
** На дистрибутивах на основе RHEL5 следующее относится к версиям Tomcat 6 до Tomcat 6.0.38 **
Обратите внимание, что TLSv1.1,TLSv1.2
поддерживается Java 7, а не Java 6. Добавление этих директив на сервер под управлением Java 6 безвредно, но не включает TLSv1.1 и TLSv1.2.
<Connector...
enableLookups="true" disableUploadTimeout="true"
acceptCount="100" maxThreads="200" SSLEnabled="true" scheme="https" secure="true"
clientAuth="false" sslProtocols = "TLSv1,TLSv1.1,TLSv1.2" />
Tomcat> = 7
<Connector...
enableLookups="true" disableUploadTimeout="true"
acceptCount="100" maxThreads="200" SSLEnabled="true" scheme="https" secure="true"
clientAuth="false" sslProtocols = "TLSv1,TLSv1.1,TLSv1.2" />
Соединители Tomcat APR
<Connector...
maxThreads="200"
enableLookups="true" disableUploadTimeout="true"
acceptCount="100" scheme="https" secure="true"
SSLEnabled="true"
SSLProtocol="TLSv1"
SSLCertificateFile="${catalina.base}/conf/localhost.crt"
SSLCertificateKeyFile="${catalina.base}/conf/localhost.key" />
вышеизложенное изменено, чтобы соответствовать вашим спецификациям разъема. Источник: https://access.redhat.com/solutions/1232233
У меня есть похожий вариант использования, который позволяет Tomcat 7 строго использовать только TLSv1.2, а не использовать более ранние протоколы SSL, такие как TLSv1.1 или SSLv3.
Я использую: C:\apache-tomcat-7.0.64-64bit и C:\Java64\jdk1.8.0_60.
Следуйте этой инструкции: https://tomcat.apache.org/tomcat-7.0-doc/security-howto.html. Tomcat относительно прост в настройке поддержки SSL.
Из многих ссылок я протестировал множество комбинаций, в конце концов я нашел 1, которая заставит Tomcat 7 принимать только TLSv1.2. 2 места нужно потрогать:
1) В C:\apache-tomcat-7.0.64-64bit\conf\server.xml
<Connector port="8443"
protocol="org.apache.coyote.http11.Http11Protocol"
maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
keystoreFile="ssl/.keystore" keystorePass="changeit"
clientAuth="false" sslProtocol="SSL" sslEnabledProtocols="TLSv1.2" />
где
keystoreFile
= локальное самозаверяющее доверенное хранилище
org.apache.coyote.http11.Http11Protocol
= JSSE BIO реализация.
Мы не используем org.apache.coyote.http11.Http11AprProtocol
, потому что он работает на openssl. Базовый openssl будет использовать более ранние протоколы SSL.
2) При запуске Tomcat включите следующие параметры среды.
set JAVA_HOME=C:\Java64\jdk1.8.0_60
set PATH=%PATH%;C:\Java64\jdk1.8.0_60\bin
set CATALINA_HOME=C:\apache-tomcat-7.0.64-64bit
set JAVA_OPTS=-Djdk.tls.client.protocols="TLSv1.2" -Dsun.security.ssl.allowUnsafeRenegotiation=false -Dhttps.protocols="TLSv1.2"
Требуется ограничение JAVA_OPTS, в противном случае Tomcat (работающий на Java8) откажется от поддержки более ранних протоколов SSL.
Запустите Tomcat C:\apache-tomcat-7.0.64-64bit\bin\startup.bat
Мы видим, что JAVA_OPTS появляется в журнале запуска Tomcat.
Oct 16, 2015 4:10:17 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: Command line argument: -Djdk.tls.client.protocols=TLSv1.2
Oct 16, 2015 4:10:17 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: Command line argument: -Dsun.security.ssl.allowUnsafeRenegotiation=false
Oct 16, 2015 4:10:17 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: Command line argument: -Dhttps.protocols=TLSv1.2
Затем мы можем использовать команду openssl для проверки наших настроек. Сначала подключите localhost:8443 с протоколом TLSv1.1. Tomcat отказывается отвечать сертификатом сервера.
C:\OpenSSL-Win32\bin>openssl s_client -connect localhost:8443 -tls1_1
Loading 'screen' into random state - done
CONNECTED(000001C0)
5372:error:1408F10B:SSL routines:SSL3_GET_RECORD:wrong version number:.\ssl\s3_pkt.c:362:
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 5 bytes and written 0 bytes
Подключите localhost:8443 с протоколом TLSv1.2, Tomcat отвечает ServerHello сертификатом:
C:\OpenSSL-Win32\bin>openssl s_client -connect localhost:8443 -tls1_2
Loading 'screen' into random state - done
CONNECTED(000001C0)
depth=1 C = US, ST = Washington, L = Seattle, O = getaCert - www.getacert.com
verify error:num=19:self signed certificate in certificate chain
---
Certificate chain
0 s:/C=SG/ST=SG/L=Singapore/O=Xxxx/OU=Development/CN=Myself
i:/C=US/ST=Washington/L=Seattle/O=getaCert - www.getacert.com
1 s:/C=US/ST=Washington/L=Seattle/O=getaCert - www.getacert.com
i:/C=US/ST=Washington/L=Seattle/O=getaCert - www.getacert.com
---
Server certificate
-----BEGIN CERTIFICATE-----
(ignored)
-----END CERTIFICATE-----
subject=/C=SG/ST=SG/L=Singapore/O=Xxxx/OU=Development/CN=Myself
issuer=/C=US/ST=Washington/L=Seattle/O=getaCert - www.getacert.com
---
No client certificate CA names sent
Peer signing digest: SHA512
Server Temp Key: ECDH, P-256, 256 bits
---
SSL handshake has read 2367 bytes and written 443 bytes
Это доказывает, что Tomcat теперь строго отвечает только на запрос TLSv1.2.
В документации Tomcat 7 четко указано, что sslEnabledProtocols
а также sslProtocol
параметры поддерживаются и что между ними есть совпадение:
https://tomcat.apache.org/tomcat-7.0-doc/config/http.html
Для более новых Tomcats используйте комбинацию sslProtocols и sslEnabledProtocols, например:
<Connector port="8443" maxHttpHeaderSize="8192"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" disableUploadTimeout="true"
acceptCount="100" scheme="https" secure="true"
clientAuth="false"
sslProtocols="TLSv1,TLSv1.1,TLSv1.2"
sslEnabledProtocols="TLSv1,TLSv1.1,TLSv1.2"
SSLEnabled="true"
URIEncoding="UTF-8" keystorePass=""/>
В Tomcat 6.0.41 вам нужно будет использовать блокирующий разъем, поскольку NIO игнорирует эти настройки.
http://wiki.apache.org/tomcat/Security/POODLE
http://mail-archives.apache.org/mod_mbox/tomcat-users/201410.mbox/%3C5440F1C6.3040205@apache.org%3E
Соединитель port="443" protocol="org.apache.coyote.http11.Http11Protocol"
maxThreads="200" схема = "https" secure = "true" SSLEnabled = "true" clientAuth = "false"
keystoreFile = "tomcat.jks" keystorePass = "changeit" sslEnabledProtocols = "TLSv1, TLSv1.1, TLSv1.2" />
Во-первых, как говорит @iviorel, это не sslProtocols
, его sslProtocol
, (Почему его ответ стал заниженным?)
JSSE
Для меня на Tomcat 7 и Java 7, sslProtocol
в следующей конфигурации не работает:
<Connector SSLEnabled="true" clientAuth="false"
keyAlias="keyalias" keystoreFile="keystore" keystorePass="changeit"
maxThreads="150" port="443" protocol="org.apache.coyote.http11.Http11Protocol"
scheme="https" secure="true" sslProtocol="TLSv1,TLSv1.1,TLSv1.2" />
Это говорит:
SEVERE: Failed to initialize end point associated with ProtocolHandler ["http-bio-443"]
java.io.IOException: TLSv1,TLSv1.1,TLSv1.2 SSLContext not available
at org.apache.tomcat.util.net.jsse.JSSESocketFactory.init(JSSESocketFactory.java:465)
at org.apache.tomcat.util.net.jsse.JSSESocketFactory.createSocket(JSSESocketFactory.java:187)
at org.apache.tomcat.util.net.JIoEndpoint.bind(JIoEndpoint.java:398)
at org.apache.tomcat.util.net.AbstractEndpoint.init(AbstractEndpoint.java:646)
...
Caused by: java.security.NoSuchAlgorithmException: TLSv1,TLSv1.1,TLSv1.2 SSLContext not available
at sun.security.jca.GetInstance.getInstance(GetInstance.java:159)
at javax.net.ssl.SSLContext.getInstance(SSLContext.java:156)
at org.apache.tomcat.util.net.jsse.JSSESocketFactory.createSSLContext(JSSESocketFactory.java:478)
at org.apache.tomcat.util.net.jsse.JSSESocketFactory.init(JSSESocketFactory.java:439)
... 19 more
Но следующее работает просто отлично:
<Connector SSLEnabled="true" clientAuth="false"
keyAlias="keyalias" keystoreFile="keystore" keystorePass="changeit"
maxThreads="150" port="443" protocol="org.apache.coyote.http11.Http11Protocol"
scheme="https" secure="true" sslEnabledProtocols="TLSv1,TLSv1.1,TLSv1.2" />
апреле
Чтобы отключить SSL v3 и включить протокол TLSv1:
SSLProtocol="TLSv1"
Чтобы включить протоколы TLSv1, TLSv1.1, TLSv1.2:
SSLProtocol="TLSv1+TLSv1.1+TLSv1.2"
Или же:
SSLProtocol="all"
Примечание: для значений "TLSv1.1", "TLSv1.2" требуется Tomcat Native 1.1.32 и версия Tomcat, которая его поддерживает.
В Tomcat 5.5 вы должны использовать недокументированный параметр
protocols="TLSv1"
ограничить использование именно этой версии протокола.
Чтобы отключить SSL 3 (POODLE) в Jboss 4.0.3 SP1 (Tomcat 5.5 с java 1.5) в server.xml, измените свой код следующим образом.
<Connector port="443" address="${jboss.bind.address}"
maxThreads="100" strategy="ms" maxHttpHeaderSize="8192"
emptySessionPath="true"
scheme="https" secure="true" clientAuth="false"
keystoreFile="${jboss.server.home.dir}/conf/eCP.keystore"
keystorePass="password"
sslProtocol="TLS"
protocols="TLSv1,TLSv1.1,TLSv1.2" />