Pergunta

Estou recebendo este 'HTTPS hostname errado:' erro ao tentar se conectar a um servidor usando https. Meu url é algo como isto

https://sub.domain.com/tamnode/webapps/app/servlet.

I conectar usando o seguinte código

    // Create a URLConnection object for a URL
    URL url = new URL(requestedURL);
    HttpURLConnection.setFollowRedirects(false);

    // connect
    connection = (HttpURLConnection) url.openConnection();
    connection.setDoOutput(true);
    connection.setRequestProperty("User-Agent", USER_AGENT); //$NON-NLS-1$

    OutputStreamWriter wr = new OutputStreamWriter(connection
            .getOutputStream());

mas, em seguida, obter um erro

IOException: HTTPS hostname wrong:  should be <sub.domain.com>. 
    at sun.net.www.protocol.https.HttpsClient.checkURLSpoofing
    ....

Este é o código que tem funcionado no passado, mas não mais. Houve algumas mudanças na arquitetura do sistema, mas eu preciso para obter mais dados antes de se aproximar dos responsáveis.

O que pode causar esse erro? Posso desativar a verificação URLSpoofing?

Foi útil?

Solução

Parece que o certificado SSL para domain.com foi dado a sub.domain.com. Ou, mais provavelmente, o que foi domain.com foi renomeado para sub.domain.com sem atualizar o certificado SSL.

Outras dicas

cletus está certo sobre a causa provável.

Há uma maneira de desligar a verificação paródia, também.

Você pode criar um objeto que implementa HostnameVerifier que os retornos verdadeiros sob circunstâncias mais do que 'normal'.

Você poderia substituir o HostnameVerifier padrão chamando setHostnameVerifier no objeto de conexão no código em questão.

Essa resposta foi 'inspirado por': http://www.java -samples.com/showtutorial.php?tutorialid=211

Eu encontrei esse link com esta consulta: http: / /www.google.com/search?q=https+hostname+wrong+should+be

Uma nota mais: pense duas vezes antes de fazer isso. Você vai criar uma fraqueza explorável na segurança entre os seus componentes de cliente e servidor.

Eu tenho essa exceção - java.io.IOException: HTTPS hostname wrong: should be <localhost>

.

A minha solução é que eu mudei de certificado auto-assinado e fazer o CN=localhost.

ou

Adicionar seu domínio de nome do certificado cn=<domain-name> para o seu arquivo host provavelmente localizado em c: / windows / system32 / drivers / etc /...

O código a seguir resolvido meu problema

static {
    //for localhost testing only
    javax.net.ssl.HttpsURLConnection.setDefaultHostnameVerifier(
            new javax.net.ssl.HostnameVerifier() {

        @Override
        public boolean verify(String hostname,
                javax.net.ssl.SSLSession sslSession) {
            if (hostname.equals("your_domain")) {
                return true;
            }
            return false;
        }
    });
}

Use o nome do host (nome DNS) como nome de Alias.

Ex:

keytool -import -alias <google.com> -file certificate_one.cer -keystore cacerts

Java verifica padrão que o certificado CN (Nome Comum) é o mesmo que o nome do host na URL. Se o CN no certificado não é o mesmo que o nome do host , o seu cliente de serviço web falha com a seguinte exceção: java.io.IOException: HTTPS hostname errado: deve ser hostname como nos certificados.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top