SSLProtocolException: handshake alert: unrecognized_name

SSLProtocolException: handshake alert: unrecognized_name

javax.net.ssl.SSLProtocolException: handshake alert: unrecognized_name

Após a instalação do Java 7u4 (antes utilizava o 6u29) no meu ambiente de desenvolvimento, algumas aplicações começaram a apresentar uma exceção. Essas aplicações estavam rodando no OC4J e funcionavam normalmente antes da atualização. O estranho é que eu não havia alterado nada nas aplicações, apenas atualizado a versão do Java.

O erro ocorria logo após eu logar no sistema único de acesso da empresa em que trabalho. Era exibida a seguinte exceção no console:

javax.net.ssl.SSLProtocolException: handshake alert:  unrecognized_name
	at sun.security.ssl.ClientHandshaker.handshakeAlert(ClientHandshaker.java:1289)
	at sun.security.ssl.SSLSocketImpl.recvAlert(SSLSocketImpl.java:1936)
	at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1059)
	at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1294)
	at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1321)
	at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1305)
	at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:515)
	at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:185)
	at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1299)
	at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:254)

Pesquisando na Internet, verifiquei que o erro está relacionado com o Java Secure Socket Extension (JSSE), mais especificamente com o Server Name Indication (SNI).

Java Secure Socket Extension (JSSE)

O JSSE é um componente do JDK responsável por tornar as comunicações, entre servidores distintos, seguras. Utiliza os protocolos SSL (Secure Sockets Layer) e TLS (Transport Layer Security), incluindo funcionalidades de criptografia de dados, autenticação de clientes e servidores, integridade, entre outros. Ele é responsável por impedir que destinatários que não sejam os pretendidos acessem os dados indevidamente.

Server Name Indication (SNI)

SNI é uma extensão do TLS, definido na RFC 4366. Ele permite conexões TLS para servidores virtuais, em que vários servidores de nomes de rede diferentes estão hospedados em um único endereço de rede subjacente.

Alguns servidores SSL/TLS não suportam as extensões do SNI, nesse caso deveremos desabilitar essa extensão conforme mostrarei a seguir.

Porque ocorre o erro “unrecognized_name”?

Esse erro ocorre por conta da seguinte regra encontrada na especificação do TLS:

If the server understood the client hello extension but does not recognize the server name, it SHOULD send an "unrecognized_name" alert (which MAY be fatal).

Ou seja, o TLS envia um alerta se os servidores que estão se comunicando não forem reconhecidos entre si. Pelo que eu entendi, a especificação diz que a mensagem PODER SER fatal. Acredito que a partir da versão 7 do Java ele entrou nesse “parênteses”. 🙂

Resolvendo o problema

Existem três formas de solucionar esse problema:

  • Desabilitando a extensão SNI;
  • Utilizando apenas SSL3;
  • Configurando o servidor-cliente para reconhecer o servidor ao qual ele deseja se comunicar.

Como estou utilizando minha máquina apenas para ambiente de desenvolvimento, optei pela primeira opção, desabilitando a extensão SNI através do parâmetro jsse.enableSNIExtension setado para false. Como utilizo o Eclipse, abri a aba Servers, cliquei duas vezes na cofiguração do meu servidor e depois em Open launch configuration. Na aba Arguments, em VM arguments, basta informar o código -Djsse.enableSNIExtension=false, conforme imagem abaixo:

unrecognized_name - jsse.enableSNIExtension

Se você souber alguma outra forma de resolver o problema de handshake alert: unrecognized_name, comente abaixo.

Boa sorte.

4 Replies to “SSLProtocolException: handshake alert: unrecognized_name”

Deixe uma resposta

O seu endereço de e-mail não será publicado.