Domanda

Ricevo questo errore 'Nome host HTTPS errato:' quando provo a connettermi a un server usando https. Il mio URL è simile a questo

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

Mi collego utilizzando il seguente codice

    // 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());

ma poi viene visualizzato un errore

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

Questo è un codice che ha funzionato in passato ma non più. Sono state apportate alcune modifiche all'architettura del sistema, ma devo ottenere più dati prima di rivolgersi ai responsabili.

Cosa può causare questo errore? Posso disattivare il controllo URLSpoofing?

È stato utile?

Soluzione

Sembra che il certificato SSL per domain.com sia stato assegnato a sub.domain.com. O, più probabilmente, quello che era domain.com è stato rinominato sub.domain.com senza aggiornare il certificato SSL.

Altri suggerimenti

cletus ha ragione sulla probabile causa.

Esiste anche un modo per disattivare il controllo dello spoof.

Puoi creare un oggetto che implementa HostnameVerifier che restituisce true in più circostanze del" solito ".

Dovresti sostituire l'hostnameVerifier predefinito chiamando setHostnameVerifier sull'oggetto connessione nel codice nella domanda.

Questa risposta è stata "ispirata da": http://www.java -samples.com/showtutorial.php?tutorialid=211

Ho trovato quel link con questa query: http: / /www.google.com/search?q=https+hostname+wrong+should+be

Un'altra nota: pensaci due volte prima di farlo. Creerai una debolezza sfruttabile nella sicurezza tra i componenti client e server.

Ho ricevuto questa eccezione - java.io.IOException: nome host HTTPS errato: dovrebbe essere < localhost > .

La mia soluzione è che ho cambiato il mio certificato autofirmato e ho creato il CN = localhost .

o

Aggiungi il tuo nome di dominio certificato cn = < nome di dominio > al tuo file host che si trova probabilmente in c: / windows / system32 / drivers / etc /...

Il seguente codice ha risolto il mio 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;
        }
    });
}

Utilizza il nome host (nome DNS) come nome alias.

Esempio:

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

Java per impostazione predefinita verifica che il certificato CN (Nome comune) sia uguale al nome host nell'URL. Se la CN nel certificato non corrisponde al nome host , il client del servizio Web non riesce con la seguente eccezione: java.io.IOException: nome host HTTPS errato: dovrebbe essere hostname come nei certificati.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top