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.