[Ciphersuite không được hỗ trợ] [Java SSLSocket]
Tôi đang cố gắng kết nối máy chủ thông qua SSLSocket bằng giao thức TLSv1.2. Máy chủ chỉ hỗ trợ các mật mã sau.
- ECDHE-ECDSA-AES128-GCM-SHA256
- ECDHE-RSA-AES128-GCM-SHA256
- ECDHE-ECDSA-AES128-SHA256
Khi tôi cố gắng đặt các bộ mật mã đã bật, tôi đang gặp phải Ngoại lệ sau:
java.lang.IllegalArgumentException: Unsupported ciphersuite ECDHE-ECDSA-AES128-GCM-SHA256
at sun.security.ssl.CipherSuite.valueOf(Unknown Source) ~[?:1.8.0_74]
at sun.security.ssl.CipherSuiteList.<init>(Unknown Source) ~[?:1.8.0_74]
at sun.security.ssl.SSLSocketImpl.setEnabledCipherSuites(Unknown Source) ~[?:1.8.0_74]
Tôi đã cố gắng thay thế các tệp chính sách phạm vi quyền hạn không giới hạn của phần mở rộng Java Cryptography (JCE) 8 từ URL sau trên C: \ Program Files \ Java \ jdk1.8.0_92 \ jre \ lib \ security nhưng vẫn không thể kết nối máy chủ.
URL: https://www.oracle.com/java/technologies/javase-jce8-downloads.html
Tôi đang sử dụng Mã sau để tạo SSLSocket:
protected void openSocket() throws IOException {
LGR.info("Opening SSL socket to " + addr + ":" + port);
String[] TLS_SUPPORTED_VERSIONS = new String[] { "TLSv1.2" };
String[] CIPHER_SUITES = new String[] { "ECDHE-ECDSA-AES128-GCM-SHA256", "ECDHE-RSA-AES128-GCM-SHA256", "ECDHE-ECDSA-AES128-SHA256" };
try {
SSLSocket socket = (SSLSocket) SSLSocketFactory.getDefault().createSocket(addr, port);
socket.setEnabledProtocols(TLS_SUPPORTED_VERSIONS);
socket.setEnabledCipherSuites(CIPHER_SUITES);
} catch (Exception ex) {
LGR.error("##Exception##", ex);
} catch (Throwable ex) {
LGR.error("##Throwable##", ex);
}
}
Trả lời
Bạn có thể liệt kê các bộ mật mã được hỗ trợ bằng cách sử dụng:
SSLSocketFactory socketFactory = SSLContext.getDefault().getSocketFactory();
for (String cipherSuite : socketFactory.getSupportedCipherSuites()) {
System.out.println(cipherSuite);
}
Các mục sau đây phù hợp với bộ yêu cầu của bạn: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256.
Bạn không cần Tệp Chính sách Quyền hạn Sức mạnh Không giới hạn của JCE nữa:
- trong Java 8 u151 / u152 các tệp chính sách đã được bao gồm trong bản phân phối Java tiêu chuẩn, nhưng cần được bật một cách rõ ràng:
Security.setProperty("crypto.policy", "unlimited"); - kể từ Java 8 u161 + (và trong tất cả các phiên bản Java sắp tới), các tệp chính sách này được bao gồm và chính sách tiền điện tử không giới hạn được bật theo mặc định.
Bạn có thể xác minh nó như sau: Cipher.getMaxAllowedKeyLength("AES")sẽ trở lại Integer.MAX_VALUEkhi bật tính năng phát không giới hạn.