Apache Tomcat'te SSLv3 desteğini nasıl devre dışı bırakabilirim?


20

Apache Tomcat sunucumu yalnızca TLSv1 kullanacak şekilde yeniden yapılandırmaya çalışıyorum. Ancak, yine de belirli tarayıcıları kullanarak SSLv3'e geri dönüyor.

<connector> etiketini aşağıdaki ayarlarla ayarladım:

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

Bir yapılandırma ayarını kaçırıyor muyum yoksa olmamam gereken bir şey var mı?


V3 ile ilgili sorun nedir? V1'in güvenlik sorunları olduğunu düşündüm.
mdpc

8
@mdpc POODLE SSLv3'ü etkiler.
CoverosGene

2
Tomcat sürümü? JDK sürümü? Son sürümlerde sslProtocol varsayılan olarak TLS'dir.
Xavier Lucas

2
rmeisen: Yanıtlar Tomcat ve Java sürümlerinize ve JSSE ayetleri AJP kullanıyorsanız bağlı olarak değişir. Farklılıklar sslProtocols=TLSv1âyetler kadar incedir sslProtocol="TLS"(Dikkat edin s?). Tomcat ve Java sürümlerinizi belirtmeniz sizi delilikten kurtaracaktır.
Stefan Lasiewski

Yanıtlar:


12

Tomcat 5 ve Version 6 sürümlerine bağlı olarak, SSLEnabled = "true" sürümün sonuna eklendiği için çalışmayabilir. Bunu aşmak için aşağıdakileri düzenlemeniz yeterlidir: sslProtocols = TLS Alıcı: sslProtocols = "TLSv1, TLSv1.1, TLSv1.2"

Tuhaf görünüyor, ancak TLS yazmasına rağmen SSL 3 içeriyor.

Bu, Tomcat 5.5.20 ve Tomcat 6 bulut sunucularımızda düzeltildi. -Greg

Yapmanız gereken şey olduğuna inanıyorum:

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

Şifreleme paketi tanımından emin değilim ancak sslprotocols sadece TLSv1, TLSv1.1, TLSv1.2 olarak ayarlanmalıdır.

Tomcat sürümünüze bağlı olarak farklılık gösterecektir, diğer potansiyel çözümler:

Tomcat 5 ve 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 tabanlı dağıtımlarda, Tomcat 6.0.38 öncesi Tomcat 6 sürümleri için geçerlidir **

TLSv1.1,TLSv1.2Java 6 tarafından değil Java 7 tarafından desteklendiğini unutmayın. Bu yönergeleri Java 6 çalıştıran bir sunucuya eklemek zararsızdır, ancak TLSv1.1 ve TLSv1.2'yi etkinleştirmez.

<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 konektörleri

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

yukarıdakiler, bağlayıcı spesifikasyonlarınızın yukarıda belirtilenlere uygun olması için değiştirilmiştir. Kaynak: https://access.redhat.com/solutions/1232233


1
FYI, sslEnabledProtocolsTomcat 6'da bizim için sslProtocols = "TLSv1,...."çalışmadı.
Stefan Lasiewski

4

Tomcat 7'nin sadece TLSv1.2'yi kesinlikle kullanmasını sağlamak için TLSv1.1 veya SSLv3 gibi önceki SSL protokollerine geri dönmemesini sağlayan benzer bir kullanım durumum var.

Şunu kullanıyorum: C: \ apache-tomcat-7.0.64-64bit ve C: \ Java64 \ jdk1.8.0_60.

Bu talimatı izleyerek: https://tomcat.apache.org/tomcat-7.0-doc/security-howto.html . Tomcat, SSL desteği kurmak nispeten basittir.

Birçok referanstan birçok kombinasyonu test ettim, sonunda Tomcat 7'yi sadece TLSv1.2'yi kabul etmeye zorlayacak 1 tane buldum. Dokunmak için 2 yer gerekli:

1) C: \ apache-tomcat-7.0.64-64bit \ conf \ server.xml içinde

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

nerede

keystoreFile = yerel kendinden imzalı güven deposu

org.apache.coyote.http11.Http11Protocol = JSSE BIO uygulaması.

Biz kullanmayın org.apache.coyote.http11.Http11AprProtocolo Openssl tarafından desteklenmektedir çünkü. Temeldeki openssl, önceki SSL protokollerini desteklemek için geri düşecektir.

2) Tomcat'i başlatırken, aşağıdaki ortam parametrelerini etkinleştirin.

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 kısıtlaması gerekiyor, aksi takdirde Tomcat (Java8 tarafından desteklenmektedir) önceki SSL protokollerini desteklemek için geri düşecektir.

Tomcat'i başlat C:\apache-tomcat-7.0.64-64bit\bin\startup.bat

Tomcat başlangıç ​​günlüğünde JAVA_OPTS mesajının görüntülendiğini görebiliriz.

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

Ardından, kurulumumuzu doğrulamak için openssl komutunu kullanabiliriz. Önce localhost: 8443'ü TLSv1.1 protokolüyle bağlayın. Tomcat, Sunucu sertifikasıyla yanıt vermeyi reddediyor.

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 protokolü ile bağlayın, Tomcat ServerHello'yu sertifika ile yanıtladı:

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

Bu, Tomcat'in artık yalnızca TLSv1.2 talebine kesin olarak yanıt verdiğini kanıtlıyor.


Çok güzel ve kapsamlı bir cevap! Kudos!
Jenny D, Reinstate Monica'ya

Bunun JAVA_OPTS=-Djdk.tls.client.protocols="TLSv1.2gerekli olmadığını buldum (Tomcat 8.0.29, Java 1.8.0_74). Burada da bahsedilmiyor: wiki.apache.org/tomcat/Security/POODLE
Paul


0

Tomcat 6.0.41'de, NIO bağlantısı bu ayarları yok saydığı için engelleme bağlayıcısını kullanmanız gerekir.

http://wiki.apache.org/tomcat/Security/POODLE

http://mail-archives.apache.org/mod_mbox/tomcat-users/201410.mbox/%3C5440F1C6.3040205@apache.org%3E

Bağlayıcı bağlantı noktası = "443" protokolü = "org.apache.coyote.http11.Http11Protocol" maxThreads = "200" şeması = "https" secure = "true" SSLEnabled = "true" clientAuth = "yanlış"
keystoreFile = "tomcat.jks "keystorePass =" changeit "sslEnabledProtocols =" TLSv1, TLSv1.1, TLSv1.2 "/>


0

Tomcat 5.5'te belgesiz parametre kullanmalısınız

protocols="TLSv1"

Bu protokol sürümünün kullanımını kısıtlamak.


0

Server.xml dosyasında Jboss 4.0.3 SP1'de (Tomcat 5.5 java 1.5 ile Tomcat 5.5) SSL 3'ü (POODLE) devre dışı bırakmak için kodunuzu bu şekilde değiştirin.

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


0

yeni Tomcats için sslProtocols ve sslEnabledProtocols combo'yu aşağıdaki gibi kullanın :

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


0

Her şeyden önce, @iviorel söylediği gibi, o değil sslProtocols, bu kadar sslProtocol. (Cevabı niye aşağı gitti?)

JSSE
Benim için Tomcat 7 ve Java 7'de sslProtocolaşağıdaki yapılandırmada çalışmaz:

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

Diyor ki:

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

Ancak aşağıdakiler gayet iyi çalışıyor:

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

APR
SSL v3'ü devre dışı bırakmak ve TLSv1 protokolünü etkinleştirmek için:

SSLProtocol="TLSv1"

TLSv1, TLSv1.1, TLSv1.2 protokollerini etkinleştirmek için:

SSLProtocol="TLSv1+TLSv1.1+TLSv1.2"

Veya:

SSLProtocol="all"

Not: "TLSv1.1", "TLSv1.2" değerleri için Tomcat Native 1.1.32 ve bunu destekleyen bir Tomcat sürümü gerekir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.