Làm cách nào để tắt hỗ trợ SSLv3 trong Apache Tomcat?


20

Tôi đang cố gắng cấu hình lại máy chủ Apache Tomcat của mình để chỉ sử dụng TLSv1. Tuy nhiên, nó vẫn quay trở lại SSLv3 bằng một số trình duyệt nhất định.

Tôi thiết lập thẻ <Connector> với các cài đặt sau:

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

Tôi có thiếu cài đặt cấu hình hay đôi khi có mặt mà tôi không nên có mặt?


Vấn đề với v3 là gì? Tôi nghĩ rằng v1 có vấn đề bảo mật.
mdpc

8
@mdpc POODLE ảnh hưởng đến SSLv3.
CoverosGene

2
Phiên bản Tomcat? Phiên bản JDK? Trong các phiên bản gần đây, sslProtocol là TLS theo mặc định.
Xavier Lucas

2
rmeisen: Các câu trả lời sẽ thay đổi tùy thuộc vào phiên bản Tomcat và Java của bạn và nếu bạn đang sử dụng các câu JSSE AJP. Sự khác biệt là tinh tế như sslProtocols=TLSv1những câu thơ sslProtocol="TLS"(Lưu ý rằng s?). Chỉ định các phiên bản Tomcat & Java của bạn sẽ giúp bạn tránh khỏi sự điên rồ.
Stefan Lasiewski

Câu trả lời:


12

Tùy thuộc vào phiên bản Tomcat 5 và Phiên bản 6, SSLEnables = "true" có thể không hoạt động vì được thêm vào giữa phiên bản. Để vượt qua điều này, bạn chỉ cần chỉnh sửa như sau: sslProt Protocol = TLS To: sslProt Protocol = "TLSv1, TLSv1.1, TLSv1.2"

Có vẻ lạ nhưng mặc dù nó nói TLS, nó chứa SSL 3.

Điều này đã sửa nó trên Tomcat 5.5.20 và Tomcat 6 của chúng tôi. -Greg

Tôi tin rằng những gì bạn cần làm là:

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

Không chắc chắn về định nghĩa bộ mật mã tuy nhiên các giao thức sslprot chỉ nên được đặt thành TLSv1, TLSv1.1, TLSv1.2

tùy thuộc vào phiên bản tomcat của bạn, nó sẽ khác, các giải pháp tiềm năng khác:

Tomcat 5 và 6

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

** Trên các bản phân phối dựa trên RHEL5, các điều sau đây áp dụng cho các phiên bản Tomcat 6 trước Tomcat 6.0,38 **

Lưu ý rằng TLSv1.1,TLSv1.2được hỗ trợ bởi Java 7, không phải Java 6. Thêm các chỉ thị này vào máy chủ chạy Java 6 là vô hại, nhưng sẽ không kích hoạt 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" />

Mèo con> = 7

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

Đầu nối 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" />

ở trên được thay đổi để phục vụ cho những gì thông số kỹ thuật kết nối của bạn ở trên. Nguồn: https://access.redhat.com/solutions/1232233


1
FYI, sslEnabledProtocolsđã không làm việc cho chúng tôi trên Tomcat 6. sslProtocols = "TLSv1,...."đã làm.
Stefan Lasiewski

4

Tôi có một trường hợp sử dụng tương tự, đó là cho phép Tomcat 7 chỉ sử dụng nghiêm ngặt TLSv1.2, không quay trở lại các giao thức SSL trước đó như TLSv1.1 hoặc SSLv3.

Tôi đang sử dụng: C: \ apache-tomcat-7.0.64-64bit và C: \ Java64 \ jdk1.8.0_60.

Làm theo hướng dẫn này: https://tomcat.apache.org/tomcat-7.0-doc/security-howto.html . Tomcat tương đối đơn giản để thiết lập hỗ trợ SSL.

Từ nhiều tài liệu tham khảo tôi đã thử nghiệm nhiều kết hợp, cuối cùng tôi đã tìm thấy 1 cái sẽ thực thi Tomcat 7 chỉ chấp nhận TLSv1.2. 2 nơi cần thiết để chạm vào:

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

Ở đâu

keystoreFile = cửa hàng ủy thác tự ký tại địa phương

org.apache.coyote.http11.Http11Protocol = Thực hiện BSS JSSE.

Chúng tôi không sử dụng org.apache.coyote.http11.Http11AprProtocol, bởi vì nó được cung cấp bởi openssl. Các openssl cơ bản sẽ quay trở lại để hỗ trợ các giao thức SSL trước đó.

2) Khi khởi động Tomcat, bật các tham số môi trường sau.

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"

Yêu cầu hạn chế JAVA_OPTS, nếu không Tomcat (được cung cấp bởi Java8) sẽ quay lại để hỗ trợ các giao thức SSL trước đó.

Khởi động Tomcat C:\apache-tomcat-7.0.64-64bit\bin\startup.bat

Chúng ta có thể thấy JAVA_OPTS xuất hiện trong nhật ký khởi động 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

Sau đó, chúng tôi có thể sử dụng lệnh openssl để xác minh thiết lập của chúng tôi. Đầu tiên kết nối localhost: 8443 với giao thức TLSv1.1. Tomcat từ chối trả lời với chứng chỉ máy chủ.

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

Kết nối localhost: 8443 với giao thức TLSv1.2, Tomcat trả lời ServerHello bằng chứng chỉ:

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

Điều này chứng tỏ rằng Tomcat hiện chỉ đáp ứng nghiêm ngặt yêu cầu TLSv1.2.


Câu trả lời rất hay và kỹ lưỡng! Thanh danh!
Jenny D nói Phục hồi lại

Tôi thấy điều đó JAVA_OPTS=-Djdk.tls.client.protocols="TLSv1.2là không cần thiết (Tomcat 8.0,29, Java 1.8.0_74). Nó cũng không được đề cập ở đây: wiki.apache.org/tomcat/Security/POODLE
Paul


0

Trong Tomcat 6.0.41, bạn sẽ cần sử dụng trình kết nối chặn vì NIO đang bỏ qua các cài đặt đó.

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

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

Trình kết nối port = "443" Protocol = "org.apache.coyote.http11.Http11Protocol" maxThreads = "200 "eme =" https "safe =" true "SSLEnables =" true "clientAuth =" false "
keystoreFile =" tomcat.jks "keystorePass =" changeit "sslEnablesProt Protocol =" TLSv1, TLSv1.1, TLSv1.2 "/>


0

Trong Tomcat 5.5, bạn nên sử dụng tham số không có giấy tờ

protocols="TLSv1"

để hạn chế sử dụng phiên bản giao thức này.


0

Để vô hiệu hóa SSL 3 (POODLE) trong Jboss 4.0.3 SP1 (Tomcat 5.5 với java 1.5) trong server.xml thay đổi mã của bạn như thế này.

<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

đối với Tomcats mới hơn, hãy sử dụng sslProt ProtocolsslEnablesProt Protocol như thế này:

<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

Trước hết, như @iviorel nói, không phải sslProtocolsvậy sslProtocol. (Tại sao câu trả lời của anh ấy bị hạ thấp?)

JSSE
Đối với tôi, trên Tomcat 7 và Java 7, sslProtocoltrong cấu hình sau không hoạt động:

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

Nó nói rằng:

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

Nhưng những điều sau đây chỉ hoạt động tốt:

<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
Để tắt SSL v3 và bật giao thức TLSv1:

SSLProtocol="TLSv1"

Để bật các giao thức TLSv1, TLSv1.1, TLSv1.2:

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

Hoặc là:

SSLProtocol="all"

Lưu ý: các giá trị "TLSv1.1", "TLSv1.2" yêu cầu Tomcat Native 1.1.32 và một phiên bản Tomcat hỗ trợ nó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.