เปิดใช้งาน TLS 1.1 และ 1.2 สำหรับลูกค้าบน Java 7


50

Java 7 ปิดใช้งาน TLS 1.1 และ 1.2 สำหรับลูกค้า จากเอกสารJava Cryptography Architecture ผู้ให้บริการของ Oracle :

แม้ว่า SunJSSE ในรีลีส Java SE 7 รองรับ TLS 1.1 และ TLS 1.2 แต่จะไม่เปิดใช้งานเวอร์ชันตามค่าเริ่มต้นสำหรับการเชื่อมต่อไคลเอนต์ เซิร์ฟเวอร์บางตัวไม่สามารถใช้การทำงานร่วมกันได้อย่างถูกต้องและปฏิเสธที่จะคุยกับไคลเอนต์ TLS 1.1 หรือ TLS 1.2 สำหรับการทำงานร่วมกัน SunJSSE ไม่เปิดใช้งาน TLS 1.1 หรือ TLS 1.2 โดยค่าเริ่มต้นสำหรับการเชื่อมต่อลูกค้า

ฉันสนใจที่จะเปิดใช้งานโปรโตคอลในการตั้งค่าทั่วทั้งระบบ (อาจผ่านไฟล์ปรับแต่ง) ไม่ใช่โซลูชันต่อแอปพลิเคชัน Java

ฉันจะดำเนินการเปิดใช้งาน TLS 1.1 และ 1.2 ระบบกว้าง ?

หมายเหตุ : ตั้งแต่พุดเดิ้ล, ผมอยากจะปิดการใช้งานการดำเนินการ SSLv3ทั้งระบบ (ปัญหาเกี่ยวกับ SSLv3 POODLE ลงวันที่ล่วงหน้าอย่างน้อย 15 ปี แต่ Java / Oracle / นักพัฒนาไม่ปฏิบัติตามหลักปฏิบัติที่ดีที่สุดดังนั้นผู้ใช้เช่นคุณและฉันจึงเหลือเรื่องยุ่ง ๆ )


นี่คือเวอร์ชั่น Java:

$ /Library/Java/JavaVirtualMachines/jdk1.7.0_07.jdk/Contents/Home/bin/java -version
java version "1.7.0_07"
Java(TM) SE Runtime Environment (build 1.7.0_07-b10)
Java HotSpot(TM) 64-Bit Server VM (build 23.3-b01, mixed mode)

สิ่งเดียวที่ใช้งานได้สำหรับฉันคือการตั้งค่า SSLContext เริ่มต้นตามที่อธิบายไว้ที่นี่: stackoverflow.com/questions/39157422/…
shmert

คำตอบ:


31

คุณสามารถเพิ่มคุณสมบัติต่อไปนี้-Dhttps.protocols=TLSv1.1,TLSv1.2ซึ่งกำหนดค่า JVM เพื่อระบุเวอร์ชันโปรโตคอล TLS ที่ควรใช้ระหว่างการเชื่อมต่อ https


6
โปรดอธิบายเพิ่มเติมเกี่ยวกับสิ่งนี้ มิฉะนั้นสิ่งนี้จะคลุมเครือและอาจสร้างความเสียหายในมือผิด
studiohack

1
@Thomasz - ฉันเห็นด้วยกับคนอื่น ๆ ที่นี่ ... ฉันจะจัดการกับระบบได้อย่างไร? มันเพิ่มเข้าไปในไฟล์กำหนดค่าของเครื่องหรือไม่? ถ้าเป็นเช่นนั้นไฟล์คืออะไรและฉันจะเพิ่มที่ไหน?
jww

3
อาจจะลิงค์นี้จะช่วย: blogs.oracle.com/java-platform-group/entry/ … คุณสามารถเพิ่มคุณสมบัติ -Dhttps.protocols เป็นพารามิเตอร์ในตัวอย่างบรรทัดคำสั่ง: java -jar yourapplication.jar -Dhttps.protocols = TLSv1 .2 หรือที่อื่นในไฟล์การกำหนดค่าแอปพลิเคชัน (เซิร์ฟเวอร์) คุณสามารถตรวจสอบว่ามันทำงานได้หรือไม่โดยการเพิ่มพารามิเตอร์เพิ่มเติม: -Djavax.net.debug = ทั้งหมดหลังจากนั้นเมื่อแอปพลิเคชันจะทำการเชื่อมต่อกับ https การเชื่อมต่อจะทำการพิมพ์ข้อมูลการเจรจาทั้งหมดรวมถึงรุ่นโปรโตคอลที่ใช้แล้ว
Tomasz Rebizant

พารามิเตอร์นี้ (https.protocols) กำลังกำหนดค่าเครื่องเสมือน Java ซึ่งควรใช้รุ่นโปรโตคอลในระหว่างการเชื่อมต่อ https
Tomasz Rebizant

3
@TomaszRebizant ใช่คุณถูกต้อง ตัวอย่างเช่นการเพิ่มexport JAVA_OPTS="-Dhttps.protocols=TLSv1.1,TLSv1.2"setenv.sh ของ Tomcat ทำให้ทั้ง TLSv1 และ TLSv2 สำหรับการเชื่อมต่อ SSL ทั้งหมดที่ทำจากแอพบนเซิร์ฟเวอร์แอปพลิเคชัน
Zaki

14

คุณสามารถลองเพิ่มสิ่งต่อไปนี้ในสคริปต์เริ่มต้นของคุณโดยสมมติว่า Java 1.7:

JAVACMD="$JAVACMD -Ddeployment.security.SSLv2Hello=false -Ddeployment.security.SSLv3=false -Ddeployment.security.TLSv1=false -D\ deployment.security.TLSv1.1=true -Ddeployment.security.TLSv1.2=true"

คำแนะนำอื่น ๆ : https://blogs.oracle.com/java-platform-group/entry/java_8_will_use_tls


ที่คุณพบเอกสารประกอบเหล่านี้ฉันไม่เห็นทุกที่ที่กล่าวถึงในเอกสาร JAVA7 สำหรับ "-D deployment.security {ProtocolName} = True / False;"
runcode

@runcode ไม่แน่ใจอย่างแน่นอน แต่มีการกล่าวถึงในบล็อก oracle.com ที่มีการอ้างถึงข้างต้น
cnst

1
@cnst - ปัญหาที่นี่คือฉันต้องติดต่อผู้พัฒนาซอฟต์แวร์ Java ทุกชิ้นและบอกให้พวกเขาทำเช่นนี้ ดังนั้นเหตุผลที่ฉันต้องการจะดำเนินการครั้งเดียวในเครื่องของฉัน
jww

ไม่ได้ผลสำหรับฉัน
Sridhar Sarnobat

9

สำหรับ Java 7 บน Mac OS X คุณไปที่System Preferences > Javaและแผงควบคุม Java จะเปิดขึ้นในหน้าต่างแยกต่างหาก จากนั้นคุณไปที่Advancedแท็บและเลื่อนลงไปที่Advanced Security Settingsส่วนและตรวจสอบUse TLS 1.1และUse TLS 1.2ช่องทำเครื่องหมาย

ป้อนคำอธิบายรูปภาพที่นี่


ขอบคุณ Spiff ฉันได้ตั้งค่า TLS 1.0 ขึ้นไปตามที่คุณได้แสดงแล้ว อย่างไรก็ตามเมื่อฉันสร้างSSLSocket(และฉันคิดว่าสิ่งนี้เกิดขึ้นกับโปรแกรม Java อื่น ๆ ) เปิดใช้งาน TLS 1.0 (และ TLS 1.1 และ 1.2 พร้อมใช้งาน)
jww

3
คุณสามารถทดสอบสิ่งนี้ในระบบของคุณได้เช่นกัน (หากสนใจ) ดาวน์โหลดProtocolTest.javaจากรายงานข้อผิดพลาดนี้และเรียกใช้งาน ในการรวบรวมและดำเนินการให้เรียกใช้javac ProtocolTest.java && java ProtocolTestในสถานี ดูสิ่งที่แสดงขึ้นภายใต้โพรโทคอที่เปิดใช้งาน
jww

2
ใช้งานได้กับ WebStart Clients และ Applets เท่านั้น มันไม่ส่งผลกระทบต่อแอปพลิเคชันเซิร์ฟเวอร์ที่เริ่มต้นด้วยจาวา
eckes

8

ฉันเพิ่งค้นคว้าสิ่งนี้และฉันต้องการเพิ่ม - สิ่งนี้จะไม่ทำงานกับ JDK การปรับใช้คุณสมบัติเฉพาะที่เกี่ยวข้องกับ Applets และสิ่งอื่น ๆ ที่ทำงานใน JRE

สำหรับแอ็พพลิเคชัน JDK (เซิร์ฟเวอร์ที่ต้องการเชื่อมต่อกับ LDAP ตัวอย่าง) เซิร์ฟเวอร์เป็นไคลเอ็นต์ แต่เป็น deployment.security จะไม่ทำงาน

ไม่มีวิธีการเปลี่ยนยกเว้นว่าคุณเขียนโค้ดบางอย่างเช่น SSLContext.getInstance ("TLSv1.2");


4

ดูเหมือนว่า deployment.security. * settings ทำงานสำหรับโปรแกรม Java Applets และ Java Web Start ที่ทำงานบนเดสก์ท็อป ตามที่คนอื่นพูดถึงที่นี่คุณสามารถแก้ไขการปรับใช้คุณสมบัติเพื่อระบุว่า

นี่คือบทความที่แสดงวิธีใช้นโยบายกลุ่มเพื่อปรับใช้ไฟล์ deployment.properties เดียวกันสำหรับผู้ใช้ทั้งหมด: http://www.darkoperator.com/blog/2013/1/12/pushing-security-configuration-for- Java-7-ปรับปรุง-10 ผ่านทาง gpo.html

น่าเสียดายที่ไม่มีวิธีการเปิดใช้งานนี้สำหรับโปรแกรมจาวาทั้งหมดในคอมพิวเตอร์ที่เรียก java.exe หรือ javaw.exe โดยตรง คุณต้องค้นหาแต่ละโปรแกรมที่ใช้ java ค้นหาไฟล์กำหนดค่าที่คุณระบุพารามิเตอร์เพื่อส่งไปยัง java และเปลี่ยน

สำหรับ Tomcat เราต้องผ่านการนี้เพื่อให้การเชื่อมต่อจาก Tomcat ไปยังเซิร์ฟเวอร์อื่น ๆ ที่ใช้ TLS 1.1 -Dhttps.protocols=TLSv1.1,TLSv1.2ขึ้นไป: บน Linux นี้สามารถทำได้โดยการแก้ไขหรือโดยการสร้างbin/catalina.shbin/setenv.sh

ฉันไม่รู้ว่าจะใช้อย่างไรเพื่อให้ Tomcat ใช้ TLS 1.2 ทางฝั่งเซิร์ฟเวอร์เท่านั้น เราอยู่ข้างหน้าด้วย Apache HTTP


1

หากคุณติดอยู่กับ Java 7 คุณสามารถเพิ่ม-Djdk.tls.client.protocols=TLSv1.1,TLSv1.2ข้อโต้แย้งของ JVM

โปรดทราบว่านี่มีหลายประการ:

  • ใช้ได้เฉพาะเริ่มต้นจากการอัปเดต Java 7 95 การอ้างอิง: https://blogs.oracle.com/java-platform-group/diagnosing-tls,-ssl,-and-https
  • ไม่ใช่โซลูชันทั่วทั้งระบบแม้ว่าอาจถูกตั้งค่าในตัวแปรสภาพแวดล้อม (ตัวอย่างเช่นJAVA_OPTS) ซึ่งในกรณีนี้คุณขึ้นอยู่กับการสนับสนุนของ envvar ในแอปพลิเคชัน Java ของคุณ

แม้จะมีข้อบกพร่องเหล่านี้ฉันคิดว่านี่อาจเป็นประโยชน์โดยเฉพาะเมื่อโปรโตคอลหนึ่งสนใจใช้ TLS แต่ไม่ใช่ HTTPS เช่น LDAPS

[อัพเดท] ใน บริษัท ของฉันที่ใช้งานกลุ่มของเซิร์ฟเวอร์บน Ubuntu เราได้ตระหนักว่าแม้แต่การอัพเดท 121 จาก OpenJDK 7 ก็ยังไม่เพียงพอที่จะใช้งานได้อย่างถูกต้อง เราได้อัปเดตเซิร์ฟเวอร์ทั้งหมดเพื่ออัปเดต 181 ก่อนที่จะทำงาน

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