ฉันจะปิดการใช้งาน SSLv3 ใน Apache Tomcat ได้อย่างไร


20

ฉันกำลังพยายามกำหนดค่าเซิร์ฟเวอร์ Apache Tomcat ใหม่ให้ใช้ TLSv1 เท่านั้น อย่างไรก็ตามมันยังคงกลับไปสู่ ​​SSLv3 โดยใช้เบราว์เซอร์บางตัว

ฉันตั้งค่าแท็ก <connector> ด้วยการตั้งค่าต่อไปนี้:

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

ฉันขาดการตั้งค่าคอนฟิเกอเรชันหรือมีของขวัญอยู่ในปัจจุบันที่ฉันไม่ควรมีอยู่หรือไม่


ปัญหาของ v3 คืออะไร ฉันคิดว่า v1 มีปัญหาด้านความปลอดภัย
mdpc

8
@mdpc POODLE ส่งผลกระทบต่อ SSLv3
CoverosGene

2
รุ่น Tomcat รุ่น JDK ในเวอร์ชันล่าสุด sslProtocol คือ TLS โดยค่าเริ่มต้น
Xavier Lucas

2
rmeisen: คำตอบจะแตกต่างกันไปขึ้นอยู่กับรุ่น Tomcat และ Java ของคุณและหากคุณใช้ JSSE ข้อ AJP ความแตกต่างนั้นลึกซึ้งพอ ๆ กับsslProtocols=TLSv1ข้อsslProtocol="TLS"(สังเกตว่าs?) การระบุรุ่น Tomcat & Java ของคุณจะช่วยให้คุณประหยัดจากความวิกลจริต
Stefan Lasiewski

คำตอบ:


12

ขึ้นอยู่กับรุ่นของ Tomcat 5 และเวอร์ชัน 6 SSLEnabled = "true" อาจไม่ทำงานเนื่องจากมีการเพิ่ม mid-release หากต้องการผ่านมาคุณต้องแก้ไขสิ่งต่อไปนี้: sslProtocols = TLS ถึง: sslProtocols = "TLSv1, TLSv1.1, TLSv1.2"

ดูเหมือนจะแปลก แต่ถึงแม้ว่ามันจะบอกว่า TLS มันมี SSL 3

สิ่งนี้แก้ไขได้ใน Tomcat 5.5.20 และ Tomcat 6 ของเรา -Greg

ฉันเชื่อว่าสิ่งที่คุณต้องทำคือ:

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

** สำหรับ Distros ที่ใช้ RHEL5 ข้อมูลต่อไปนี้ใช้กับ Tomcat 6 เวอร์ชันก่อน Tomcat 6.0.38 **

โปรดทราบว่าTLSv1.1,TLSv1.2Java 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 Connectors

<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


1
FYI sslEnabledProtocolsไม่ได้ผลกับ Tomcat 6 ของ sslProtocols = "TLSv1,...."เรา
Stefan Lasiewski

4

ฉันมีกรณีการใช้งานที่คล้ายคลึงกันซึ่งทำให้ 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 อย่างเคร่งครัดเท่านั้น


คำตอบที่ดีมากและทั่วถึง! รุ่งโรจน์!
Jenny D พูดว่า Reinstate Monica

ฉันพบว่าJAVA_OPTS=-Djdk.tls.client.protocols="TLSv1.2ไม่จำเป็น (Tomcat 8.0.29, Java 1.8.0_74) ไม่ได้กล่าวถึงที่นี่เช่นกัน: wiki.apache.org/tomcat/Security/POODLE
Paul


0

ใน 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

ตัวเชื่อมต่อพอร์ต = "443" โปรโตคอล = "org.apache.coyote.http11.Http11Protocol" maxThreads = "200" รูปแบบ = "https" ปลอดภัย = "จริง" SSLEnabled = "จริง" ลูกค้า "=" เท็จ "
keystoreFile =" tomcat.jks "keystorePass =" changeit "sslEnabledProtocols =" TLSv1, TLSv1.1, TLSv1.2 "/>


0

ใน Tomcat 5.5 คุณควรใช้พารามิเตอร์ที่ไม่มีเอกสาร

protocols="TLSv1"

เพื่อ จำกัด การใช้ excatly รุ่นโปรโตคอลนี้


0

หากต้องการปิดใช้งาน 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" />


0

สำหรับ 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=""/>


0

ครั้งแรกของทั้งหมดเป็น @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 เวอร์ชันที่รองรับ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.