Bagaimana cara menonaktifkan dukungan SSLv3 di Apache Tomcat?

20

Saya mencoba mengkonfigurasi ulang server Apache Tomcat saya untuk hanya menggunakan TLSv1. Namun, masih jatuh kembali ke SSLv3 menggunakan browser tertentu.

Saya mengatur tag <connector> dengan pengaturan berikut:

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

Apakah saya kehilangan pengaturan konfigurasi atau memiliki sesuatu yang tidak seharusnya saya hadirkan?

rmiesen
sumber
Apa masalah dengan v3? Saya pikir v1 memiliki masalah keamanan.
mdpc
8
@mdpc POODLE memengaruhi SSLv3.
CoverosGene
2
Versi Tomcat? Versi JDK? Dalam versi terbaru sslProtocol adalah TLS secara default.
Xavier Lucas
2
rmeisen: Jawabannya akan bervariasi tergantung pada versi Tomcat dan Java Anda, dan jika Anda menggunakan JSSE ayat AJP. Perbedaannya sama halusnya dengan sslProtocols=TLSv1ayat sslProtocol="TLS"(Perhatikan itu s?). Menentukan versi Tomcat & Java Anda akan menyelamatkan Anda dari kegilaan.
Stefan Lasiewski

Jawaban:

12

Bergantung pada versi Tomcat 5 dan Versi 6 SSLEnabled = "true" mungkin tidak berfungsi karena ditambahkan pertengahan rilis. Untuk melewati ini, Anda hanya perlu mengedit yang berikut ini: sslProtocols = TLS Ke: sslProtocols = "TLSv1, TLSv1.1, TLSv1.2"

Tampaknya aneh tetapi meskipun dikatakan TLS, itu berisi SSL 3.

Ini memperbaikinya pada instance Tomcat 5.5.20 kami dan Tomcat 6 kami. -Greg

Saya yakin yang perlu Anda lakukan adalah:

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

Tidak yakin tentang definisi cipher suite namun sslprotocols harus disetel ke TLSv1, TLSv1.1, TLSv1.2

tergantung pada versi kucing jantan Anda itu akan berbeda, solusi potensial lainnya:

Tomcat 5 dan 6

<Connector...
   enableLookups="true" disableUploadTimeout="true"
   acceptCount="100"  maxThreads="200" SSLEnabled="true" scheme="https" secure="true"
   clientAuth="false" sslEnabledProtocols = "TLSv1,TLSv1.1,TLSv1.2" />

** Pada distro berbasis RHEL5, yang berikut ini berlaku untuk versi Tomcat 6 sebelum Tomcat 6.0.38 **

Catatan yang TLSv1.1,TLSv1.2didukung oleh Java 7, bukan Java 6. Menambahkan arahan ini ke server yang menjalankan Java 6 tidak berbahaya, tetapi tidak akan mengaktifkan 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" />

Konektor APR Tomcat

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

di atas diubah untuk memenuhi spesifikasi konektor Anda di atas. Sumber: https://access.redhat.com/solutions/1232233

RCG
sumber
1
FYI, sslEnabledProtocolstidak bekerja untuk kami di Tomcat 6. sslProtocols = "TLSv1,...."lakukan.
Stefan Lasiewski
4

Saya memiliki use case yang serupa, yaitu untuk mengaktifkan Tomcat 7 untuk hanya menggunakan TLSv1.2, tidak untuk kembali ke protokol SSL sebelumnya seperti TLSv1.1 atau SSLv3.

Saya menggunakan: C: \ apache-tomcat-7.0.64-64bit dan C: \ Java64 \ jdk1.8.0_60.

Mengikuti instruksi ini: https://tomcat.apache.org/tomcat-7.0-doc/security-howto.html . Tomcat relatif sederhana untuk mengatur dukungan SSL.

Dari banyak referensi saya menguji banyak kombinasi, akhirnya saya menemukan 1 yang akan memberlakukan Tomcat 7 untuk menerima TLSv1.2 saja. 2 tempat yang perlu disentuh:

1) Dalam 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" />

dimana

keystoreFile = toko kepercayaan lokal yang ditandatangani sendiri

org.apache.coyote.http11.Http11Protocol = Implementasi BISE JSSE.

Kami tidak menggunakan org.apache.coyote.http11.Http11AprProtocol, karena didukung oleh openssl. Openssl yang mendasarinya akan kembali untuk mendukung protokol SSL sebelumnya.

2) Saat memulai Tomcat, aktifkan parameter lingkungan berikut.

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"

Pembatasan JAVA_OPTS diperlukan, jika tidak Tomcat (yang didukung oleh Java8) akan kembali untuk mendukung protokol SSL sebelumnya.

Mulai Tomcat C:\apache-tomcat-7.0.64-64bit\bin\startup.bat

Kita bisa melihat JAVA_OPTS muncul di log startup 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

Kemudian, kita dapat menggunakan perintah openssl untuk memverifikasi pengaturan kita. Pertama-tama hubungkan localhost: 8443 dengan protokol TLSv1.1. Tomcat menolak untuk membalas dengan sertifikat Server.

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

Hubungkan localhost: 8443 dengan protokol TLSv1.2, Tomcat membalas ServerHello dengan sertifikat:

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

Ini membuktikan bahwa Tomcat sekarang hanya merespons permintaan TLSv1.2 saja.

oraclesoon
sumber
Jawaban yang sangat bagus dan menyeluruh! Pujian!
Jenny D mengatakan Reinstate Monica
Saya menemukan itu JAVA_OPTS=-Djdk.tls.client.protocols="TLSv1.2tidak perlu (Tomcat 8.0.29, Java 1.8.0_74). Tidak disebutkan di sini juga: wiki.apache.org/tomcat/Security/POODLE
Paul
0

Di Tomcat 6.0.41, Anda harus menggunakan konektor pemblokiran karena NIO mengabaikan pengaturan tersebut.

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

http://mail-archives.apache.org/mod_mbox/tomcat-users/201410.mbox/%[email protected]%3E

Port konektor = "443" protokol = "org.apache.coyote.http11.Http11Protocol" maxThreads = "200" skema = "https" secure = "true" SSLEnabled = "true" clientAuth = "false"
keystoreFile = "tomcat.jks "keystorePass =" changeit "sslEnabledProtocols =" TLSv1, TLSv1.1, TLSv1.2 "/>

PaulAndrewLang
sumber
0

Dalam Tomcat 5.5 Anda harus menggunakan parameter tidak berdokumen

protocols="TLSv1"

untuk membatasi penggunaan dari versi protokol ini.

Mik
sumber
0

Untuk menonaktifkan SSL 3 (POODLE) di Jboss 4.0.3 SP1 (Tomcat 5.5 dengan java 1.5) di server.xml ubah kode Anda seperti ini.

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

Abaya Natarajan
sumber
0

untuk Tomcats yang lebih baru, gunakan kombo sslProtocols dan sslEnabledProtocols seperti ini:

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

andrej
sumber
0

Pertama-tama, seperti yang dikatakan @iviorel, bukan sslProtocols, bukan sslProtocol. (Mengapa jawabannya dijatuhkan?)

JSSE
Bagi saya, pada Tomcat 7 dan Java 7, sslProtocoldalam konfigurasi berikut tidak berfungsi:

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

Ia mengatakan:

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

Tetapi berikut ini berfungsi dengan baik:

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

April
Untuk menonaktifkan SSL v3, dan mengaktifkan protokol TLSv1:

SSLProtocol="TLSv1"

Untuk mengaktifkan protokol TLSv1, TLSv1.1, TLSv1.2:

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

Atau:

SSLProtocol="all"

Catatan: nilai "TLSv1.1", "TLSv1.2" memerlukan Tomcat Native 1.1.32 dan versi Tomcat yang mendukungnya.

Rad
sumber