2015-10-12 41 views
10
Server: 
TLS Version: v1.2 
Cipher Suite: TLS_RSA_WITH_AES_256_CBC_SHA256 

Client: 
JRE 1.7 

Tôi nhận được báo lỗi dưới đây khi tôi cố gắng để kết nối với máy chủ từ khách hàng thông qua SSL trực tiếp:Enable TLSv1.2 và TLS_RSA_WITH_AES_256_CBC_SHA256 Cipher Suite

Caused by: javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure 
     at sun.security.ssl.Alerts.getSSLException(Alerts.java:192) 
     at sun.security.ssl.Alerts.getSSLException(Alerts.java:154) 

Mã dưới đây cho phép TLSv1.2

Set<String> enabledTLSSet = new HashSet<String>(Arrays.asList(sslsocket.getEnabledProtocols())); 
    enabledTLSSet.add("TLSv1.2");  
    sslsocket.setEnabledProtocols(enabledTLSSet.toArray(new String[enabledTLSSet.size()])); 

mã dưới đây cho phép TLS_RSA_WITH_AES_256_CBC_SHA256 Cipher Suite:

Set<String> enabledCipherSuitesSet = new HashSet<String>(Arrays.asList(sslsocket.getEnabledCipherSuites())); 
     enabledCipherSuitesSet.add("TLS_RSA_WITH_AES_256_CBC_SHA256"); 
     sslsocket.setEnabledCipherSuites(enabledCipherSuitesSet.toArray(new String[enabledCipherSuitesSet.size()])); 

Sau khi thực hiện cả hai điều trên từ mã Java, tôi có thể kết nối với máy chủ thành công thông qua SSL.

Có thể bật/buộc TLSv1.2TLS_RSA_WITH_AES_256_CBC_SHA256 trong Java 7 mà không thay đổi bất kỳ Mã Java nào thông qua các thuộc tính, tham số hoặc đạo cụ gỡ lỗi không?

Tôi đã thử tất cả các thuộc tính dưới đây trong tất cả các biểu mẫu và kết hợp (bật và tắt) và không thành công.

-Dhttps.protocols=TLSv1.2 
-Dhttps.cipherSuites=TLS_RSA_WITH_AES_256_CBC_SHA256 
-Ddeployment.security.TLSv1.2=true 

tôi đang thực hiện các chương trình tương tự như dưới đây:

java -jar -Dhttps.protocols=TLSv1.2 -Dhttps.cipherSuites=TLS_RSA_WITH_AES_256_CBC_SHA256 Ddeployment.security.TLSv1.2=true -Djavax.net.debug=ssl:handshake SSLPoker.jar <SERVER> 443 

SSLPoker chứa mã dưới đây:

package com.ashok.ssl; 

import javax.net.ssl.SSLSocket; 
import javax.net.ssl.SSLSocketFactory; 
import java.io.*; 

/** 
* Establish a SSL connection to a host and port, writes a byte and prints the response - Ashok Goli. See 
* http://confluence.atlassian.com/display/JIRA/Connecting+to+SSL+services 
*/ 
public class SSLPoke { 

    /** 
    * The main method. 
    * Usage: $java -jar SSLPoker.jar <host> <port> 
    * 
    * @param args the arguments 
    */ 
    public static void main(String[] args) { 
    if (args.length != 2) { 
     System.out.println("Usage: " + SSLPoke.class.getName() + " <host> <port>"); 
     System.exit(1); 
    } 
    try { 
     SSLSocketFactory sslsocketfactory = (SSLSocketFactory) SSLSocketFactory.getDefault(); 
     SSLSocket sslsocket = 
      (SSLSocket) sslsocketfactory.createSocket(args[0], Integer.parseInt(args[1])); 

     InputStream in = sslsocket.getInputStream(); 
     OutputStream out = sslsocket.getOutputStream(); 

     // Write a test byte to get a reaction :) 
     out.write(1); 

     while (in.available() > 0) { 
     System.out.print(in.read()); 
     } 
     System.out.println("Successfully connected"); 

    } catch (Exception exception) { 
     exception.printStackTrace(); 
    } 
    } 
} 

Bất kỳ con trỏ làm thế nào để đạt được điều này không có thay đổi mã lệnh Java sẽ được nhiều đánh giá cao.

+0

Bạn không thể thêm bộ mã hóa TLS mà không thêm toàn bộ nhà cung cấp bảo mật, chẳng hạn như Lâu đài Bouncy, thực sự có thể hỗ trợ bộ mã hóa đó. – EJP

+0

Các cài đặt mà tôi cần thực hiện để đạt được điều này là gì? –

+0

Tôi đã thêm TLS và kết nối thành công với Máy chủ bằng mã ở trên. Chỉ cần tìm cách để thực hiện điều đó thông qua cấu hình. –

Trả lời

10

Nó chỉ có thể nếu bạn sử dụng kết nối HTTPS đơn giản (không SSL Sockets) sử dụng các thuộc tính

-Dhttps.protocols=TLSv1.2 
-Dhttps.cipherSuites=TLS_RSA_WITH_AES_256_CBC_SHA256 

Xem bài tại http://fsanglier.blogspot.com.es/

Java 7 giới thiệu hỗ trợ cho TLS v1.2 (tham khảo http://docs.oracle.com/javase/7/docs/technotes/guides/security/enhancements-7.html) NHƯNG không bật theo mặc định. Nói cách khác, ứng dụng khách hàng của bạn phải chỉ định rõ ràng "TLS v1.2" khi tạo SSLContext hoặc nếu không sẽ không thể sử dụng nó.

Nếu bạn cần sử dụng giao thức socket an toàn trực tiếp, hãy tạo SSLContext "TLSv1.2" khi khởi động ứng dụng và sử dụng cuộc gọi SSLContext.setDefault (ctx) để đăng ký ngữ cảnh mới làm mặc định.

SSLContext context = SSLContext.getInstance("TLSv1.2"); 
SSLContext.setDefault(context); 
+0

Chà ... Điều này thực sự là bắt buộc. Tôi nhận thấy họ đã bị bỏ qua, nhưng không mong đợi máy chủ đã yêu cầu TLS 1.2 – Kukeltje

3

JRE tắt tất cả mã hóa 256 bit theo mặc định. Để cho phép bạn có thể tải về Java Cryptography Extension (JCE) Chính sách Unlimited Strength Thẩm quyền tập tin đây: http://www.oracle.com/technetwork/java/javase/downloads/index.html

Thay local_policy.jarUS_export_policy.jar lọ file vào thư mục lib của bạn/an ninh trong thư mục jre.

+0

Điều này làm việc hoàn hảo trong trường hợp của tôi. –

1

Dường như tàu JRE hiện tại cả tệp chính sách giới hạn và không giới hạn trong thư mục cài đặt của JRE trong lib/security, mỗi thư mục con riêng biệt. Theo mặc định, trong lib/security/java.security, chính sách limited được sử dụng theo mặc định. Nhưng nếu bạn bỏ ghi chú dòng crypto.policy=unlimited, điều này sẽ cho phép Java sử dụng các tệp chính sách unlimited và bật thuật toán mã hóa/thuật toán 256 bit.

Các vấn đề liên quan