Ativando o TLS v1.2 em Java 7

Ativando o TLS v1.2 em Java 7

1. Visão geral

When it comes to SSL connections, we should be using TLSv1.2. Na verdade, é o protocolo SSL padrão para Java 8.

E embora o Java 7 suporte TLSv1.2,the default is TLS v1.0, which is too weak these days.

Neste tutorial, discutiremos várias opções para configurar o Java 7 para usar TLSv1.2.

2. Usando argumentos da Java VM

Se estivermos usando Java 1.7.0_95 ou posterior, podemos adicionar a propriedadejdk.tls.client.protocols como um argumento de linha de comandojava para oferecer suporte a TLSv1.2:

java -Djdk.tls.client.protocols=TLSv1.2 

But Java 1.7.0_95 is available only to the customers who purchased support from Oracle. Portanto, revisaremos outras opções abaixo para habilitar o TLSv1.2 no Java 7.

3. Usando SSLSocket

Neste primeiro exemplo, vamos habilitar TLSv1.2 usandoSSLSocketFactory.

Primeiro,we can create a default SSLSocketFactory object by calling the SSLSocketFactory#getDefault factory method.

Then, we simply pass our host and port to SSLSocket#createSocket:

SSLSocketFactory socketFactory = (SSLSocketFactory) SSLSocketFactory.getDefault();
SSLSocket sslSocket = (SSLSocket) socketFactory.createSocket(hosturl, port);

OSSLSocket padrão criado acima não tem nenhum protocolo SSL associado a ele. Podemos associar os protocolos SSL ao nossoSSLSocket de algumas maneiras.

Na primeira abordagem,we can pass an array of supported SSL protocols to the setEnabledProtocols method on our SSLSocket instance:

sslSocket.setEnabledProtocols(new String[] {"TLSv1.2"});

Como alternativa, podemos usarSSLParameters, usando a mesma matriz:

SSLParameters params = new SSLParameters();
params.setProtocols(new String[] {"TLSv1.2"});
sslSocket.setSSLParameters(params);

4. Usando SSLContext

DefinirSSLSocket diretamente altera apenas uma conexão. Podemos usarSSLContext para mudar a maneira como criamos oSSLSocketFactory.

Então, em vez de usarSSLSocketFactory#getInstance,let’s do SSLContext#getInstance, giving it “TLSv1.2” as a parameter. We can just get our SSLSocketFactory from that now:

SSLContext sslContext = SSLContext.getInstance("TLSv1.2");
sslContext.init(null, null, new SecureRandom());
SSLSocketFactory socketFactory = sslContext.getSocketFactory();
SSLSocket socket = (SSLSocket) socketFactory.createSocket(url, port);

Como uma observação rápida, sempre lembre-se de usarSecureRandom ao trabalhar com SSL.

5. UsandoHttpsURLConnection

Claro, nem sempre estamos criando soquetes diretamente. Muitas vezes, estamos no nível do protocolo de aplicação.

Então, finalmente, vamos ver como habilitar TLSv1.2 emHttpsURLConnection.

Primeiro, precisaremos de uma instância deURL. Vamos imaginar que estamos nos conectando ahttps://example.org:

URL url = new URL("https://" + hosturl + ":" + port);

Agora, podemos configurar nossoSSLContext como antes:

SSLContext sslContext = SSLContext.getInstance("TLSv1.2");
sslContext.init(null, null, new SecureRandom());

Então, nossos últimos passos são criar a conexão e fornecê-la com umSSLSocketFactory:

HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();
connection.setSSLSocketFactory(sslContext.getSocketFactory());

6. Conclusão

Neste artigo rápido, mostramos algumas maneiras de ativar o TLSv1.2 no Java 7.

Os exemplos de código usados ​​neste artigo estão disponíveisover on GitHub.