[Nieobsługiwany zestaw szyfrowania] [Java SSLSocket]
Próbuję połączyć się z serwerem przez SSLSocket przy użyciu protokołu TLSv1.2. Serwer obsługuje tylko następujące szyfry.
- ECDHE-ECDSA-AES128-GCM-SHA256
- ECDHE-RSA-AES128-GCM-SHA256
- ECDHE-ECDSA-AES128-SHA256
Kiedy próbuję ustawić włączone mechanizmy szyfrowania, mam do czynienia z następującym wyjątkiem:
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]
Próbowałem zastąpić pliki 8 zasad jurysdykcji nieograniczonej siły Java Cryptography Extension (JCE) z następującego adresu URL w C: \ Program Files \ Java \ jdk1.8.0_92 \ jre \ lib \ security, ale nadal nie mogę połączyć się z serwerem.
URL: https://www.oracle.com/java/technologies/javase-jce8-downloads.html
Używam następującego kodu do tworzenia 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);
}
}
Odpowiedzi
Możesz wyświetlić listę obsługiwanych zestawów szyfrów, używając:
SSLSocketFactory socketFactory = SSLContext.getDefault().getSocketFactory();
for (String cipherSuite : socketFactory.getSupportedCipherSuites()) {
System.out.println(cipherSuite);
}
Poniższy wpis mecze w wybranym apartamencie: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256.
Nie potrzebujesz już plików polityki JCE Unlimited Strength dla jurysdykcji:
- w Javie 8 u151 / u152 pliki strategii były zawarte w standardowej dystrybucji Java, ale musiały być jawnie włączone:
Security.setProperty("crypto.policy", "unlimited"); - od wersji Java 8 u161 + (i we wszystkich nadchodzących wersjach Java) te pliki zasad są uwzględnione, a nieograniczone zasady kryptograficzne są domyślnie włączone.
Możesz to sprawdzić w następujący sposób: Cipher.getMaxAllowedKeyLength("AES")powinien powrócić, Integer.MAX_VALUEgdy włączona jest nieograniczona siła.