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