Kích hoạt TLS 1.1 và 1.2 cho Khách hàng trên Java 7


50

Java 7 vô hiệu hóa TLS 1.1 và 1.2 cho các máy khách. Từ Kiến trúc mã hóa Java Tài liệu của nhà cung cấp Oracle :

Mặc dù SunJSSE trong bản phát hành Java SE 7 hỗ trợ TLS 1.1 và TLS 1.2, nhưng không có phiên bản nào được bật theo mặc định cho các kết nối máy khách. Một số máy chủ không triển khai khả năng tương thích chính xác và từ chối nói chuyện với khách hàng TLS 1.1 hoặc TLS 1.2. Để có khả năng tương tác, SunJSSE không bật TLS 1.1 hoặc TLS 1.2 theo mặc định cho các kết nối máy khách.

Tôi quan tâm đến việc kích hoạt các giao thức trên cài đặt toàn hệ thống (có thể thông qua tệp cấu hình) và không phải là giải pháp cho mỗi ứng dụng Java.

Làm cách nào để tôi có thể kích hoạt hệ thống TLS 1.1 và 1.2 trên toàn hệ thống ?

Lưu ý : kể từ POODLE, tôi muốn vô hiệu hóa toàn bộ hệ thống SSLv3. .


Đây là phiên bản 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)

Điều duy nhất hiệu quả với tôi là thiết lập SSLContext mặc định như được mô tả ở đây: stackoverflow.com/questions/39157422/
mẹo

Câu trả lời:


31

Bạn chỉ có thể thêm thuộc tính sau -Dhttps.protocols=TLSv1.1,TLSv1.2để cấu hình JVM để chỉ định phiên bản giao thức TLS nào sẽ được sử dụng trong các kết nối https.


6
Vui lòng giải thích thêm về những gì nó làm. Nếu không, điều này là mơ hồ và có khả năng gây tổn hại trong tay sai.
studiohack

1
@Thomasz - Tôi đồng ý với những người khác ở đây ... Làm thế nào để tôi thực hiện hành chính trên cơ sở toàn hệ thống? Nó có được thêm vào tập tin cấu hình của máy không? Nếu vậy, tập tin là gì và tôi thêm nó vào đâu?
jww

3
maybye liên kết này sẽ giúp: blogs.oracle.com/java-platform-group/entry/... bạn có thể thêm tài sản -Dhttps.protocols như một param trong dòng ví dụ lệnh: java -jar yourapplication.jar -Dhttps.protocols = TLSv1 .2 hoặc một nơi nào đó trong tệp cấu hình của ứng dụng (máy chủ). Bạn có thể kiểm tra xem nó hoạt động bằng cách thêm thêm param: -Djavax.net.debug = tất cả sau đó, khi ứng dụng sẽ đàm phán https kết nối, nó sẽ in tất cả thông tin đàm phán, bao gồm cả phiên bản giao thức đã được sử dụng
Tomasz Rebizant

Thông số này (https.prot Protocol) đang định cấu hình máy ảo java phiên bản giao thức nào sẽ được sử dụng trong khi kết nối https.
Tomasz Rebizant

3
@TomaszRebizant, vâng, bạn đã đúng. Ví dụ: việc thêm export JAVA_OPTS="-Dhttps.protocols=TLSv1.1,TLSv1.2"vào setenv.sh của Tomcat cho phép cả TLSv1 & TLSv2 cho tất cả các kết nối SSL được tạo từ các ứng dụng trên máy chủ ứng dụng.
Zaki

14

Bạn có thể thử thêm một cái gì đó như sau vào tập lệnh khởi động của mình, giả sử 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"

Một số đề xuất khác: https://bloss.oracle.com/java-pl platform-group / entry / java_8_will_use_tls


nơi bạn tìm thấy các tài liệu propeties này, tôi không thấy bất cứ nơi nào họ đề cập đến trong các tài liệu JAVA7 cho "-D integration.security. {ProtocolName} = True / false;"
runcode

@runcode, không chính xác lắm, nhưng nó được đề cập trong blog oracle.com được tham chiếu ở trên
cnst

1
@cnst - vấn đề ở đây là tôi cần liên hệ với mọi nhà phát triển của mọi phần mềm Java và bảo họ làm điều này. Do đó lý do tôi muốn thực hiện nó một lần trên máy tính của mình.
jww

Không làm việc cho tôi.
Sridhar Sarnobat

9

Đối với Java 7 trên Mac OS X, bạn truy cập System Preferences > Javavà Bảng điều khiển Java mở trong một cửa sổ riêng. Sau đó, bạn đi đến Advancedtab và cuộn xuống Advanced Security Settingsphần và kiểm tra Use TLS 1.1và các Use TLS 1.2hộp kiểm.

nhập mô tả hình ảnh ở đây


Cảm ơn Spiff. Tôi đã được thiết lập cho TLS 1.0 trở lên như bạn đã trình bày. Tuy nhiên, khi tôi tạo một SSLSocket(và tôi cho rằng điều này xảy ra với các chương trình Java khác), TLS 1.0 được bật (và TLS 1.1 và 1.2 khả dụng).
jww

3
Bạn cũng có thể kiểm tra điều này trên hệ thống của mình (nếu quan tâm). Tải xuống ProtocolTest.java từ báo cáo lỗi này và thực hiện nó. Để biên dịch và thực thi, chạy javac ProtocolTest.java && java ProtocolTesttrong một thiết bị đầu cuối. Xem những gì hiển thị dưới Giao thức kích hoạt .
jww

2
Điều này chỉ hoạt động cho khách hàng và ứng dụng WebStart. Nó không ảnh hưởng đến các máy chủ ứng dụng bắt đầu với java thực thi.
eckes

8

Tôi mới nghiên cứu về điều này và tôi muốn thêm - điều này sẽ không hoạt động đối với JDK, việc triển khai. Các sản phẩm chỉ liên quan đến Applet và các công cụ khác đang chạy trong JRE.

đối với các ứng dụng JDK (một máy chủ cần kết nối với LDAP chẳng hạn) máy chủ là máy khách nhưng là triển khai. Sẽ không làm việc.

không có cách nào để thay đổi nó trừ khi bạn viết một số mã như SSLContext.getInstance ("TLSv1.2");


4

Nó trông giống như triển khai. Bảo mật. * Cài đặt cho các chương trình Java Applet và Java Web Start chạy trên máy tính để bàn. Như những người khác đề cập ở đây, bạn có thể chỉnh sửa triển khai.properies để chỉ định điều đó.

Dưới đây là một bài viết cho thấy cách sử dụng chính sách nhóm để triển khai cùng một tệp triển khai.properations cho tất cả người dùng: http://www.darkoperator.com/blog/2013/1/12/pushing-security-configuration-for- java-7-update-10-via-gpo.html

Thật không may, không có cách nào để bật tính năng này cho tất cả các chương trình java trên máy tính gọi trực tiếp java.exe hoặc javaw.exe. Bạn phải tìm từng chương trình sử dụng java, tìm tệp cấu hình nơi bạn chỉ định các tham số để truyền cho java và thay đổi nó.

Đối với Tomcat, chúng tôi đã phải vượt qua điều này để các kết nối từ Tomcat đến các máy chủ khác sử dụng TLS 1.1+ : -Dhttps.protocols=TLSv1.1,TLSv1.2. Trên Linux, điều này có thể được thực hiện bằng cách chỉnh sửa bin/catalina.shhoặc bằng cách tạo bin/setenv.sh.

Tôi không biết những gì nó cần để làm cho Tomcat chỉ sử dụng TLS 1.2 ở phía máy chủ. Chúng tôi đứng trước với HTTP HTTP.


1

Nếu bạn bị mắc kẹt với Java 7, bạn có thể thêm -Djdk.tls.client.protocols=TLSv1.1,TLSv1.2vào các đối số của JVM.

Lưu ý rằng điều này có một số cảnh báo:

  • Nó chỉ hợp lệ bắt đầu từ bản cập nhật Java 7 95. Tham khảo: https : //bloss.oracle.com/java-pl platform-group / dognose-tls,-ssl,-and- https
  • Nó không phải là một giải pháp toàn hệ thống, mặc dù nó có thể được đặt trong một biến môi trường (ví dụ, JAVA_OPTS), trong trường hợp đó bạn phụ thuộc vào sự hỗ trợ của envvar trong các ứng dụng Java của bạn.

Mặc dù có những thiếu sót này, tôi nghĩ rằng điều này có thể hữu ích, đặc biệt là khi giao thức người ta quan tâm đến việc sử dụng TLS nhưng không phải là HTTPS, ví dụ LDAPS.

[CẬP NHẬT] Trong công ty của tôi, nơi điều hành nhóm máy chủ trên Ubuntu, chúng tôi đã nhận ra rằng ngay cả bản cập nhật 121 của OpenJDK 7 cũng không đủ để thực hiện điều này một cách chính xác. Chúng tôi đã cập nhật tất cả các máy chủ để cập nhật 181 trước khi nó hoạt động.

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.