[Suíte de cifras não suportada][Java SSLSocket]
Estou tentando conectar um servidor via SSLSocket usando o protocolo TLSv1.2. O servidor suporta apenas as seguintes cifras.
- ECDHE-ECDSA-AES128-GCM-SHA256
- ECDHE-RSA-AES128-GCM-SHA256
- ECDHE-ECDSA-AES128-SHA256
Quando tento definir conjuntos de cifras ativados, estou enfrentando a seguinte exceção:
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]
Tentei substituir os arquivos de política de jurisdição de força ilimitada Java Cryptography Extension (JCE) 8 da seguinte URL em C:\Arquivos de programas\Java\jdk1.8.0_92\jre\lib\security, mas ainda não consegui conectar o servidor.
URL: https://www.oracle.com/java/technologies/javase-jce8-downloads.html
Estou usando o seguinte código para criar 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);
}
}
Respostas
Você pode listar os conjuntos de cifras compatíveis usando:
SSLSocketFactory socketFactory = SSLContext.getDefault().getSocketFactory();
for (String cipherSuite : socketFactory.getSupportedCipherSuites()) {
System.out.println(cipherSuite);
}
A entrada a seguir corresponde ao conjunto solicitado: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256.
Você não precisa mais dos Arquivos de Política de Jurisdição de Força Ilimitada JCE:
- no Java 8 u151/u152 os arquivos de política foram incluídos na distribuição Java padrão, mas precisavam ser ativados explicitamente:
Security.setProperty("crypto.policy", "unlimited"); - desde o Java 8 u161+ (e em todas as próximas versões do Java), esses arquivos de política estão incluídos e a política de criptografia ilimitada é ativada por padrão.
Você pode verificar da seguinte forma: Cipher.getMaxAllowedKeyLength("AES")deve retornar Integer.MAX_VALUEquando a força ilimitada estiver habilitada.