El nombre de host de HTTPS es incorrecto: debería ser < sub.domain.com > ;. ¿Qué causa esto?
Pregunta
Recibo el error 'Nombre de host HTTPS incorrecto:' cuando intento conectar con un servidor usando https. Mi url se ve algo como esto
https://sub.domain.com/tamnode/webapps/app/servlet.
Me conecto usando el siguiente 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());
pero luego recibe un error
IOException: HTTPS hostname wrong: should be <sub.domain.com>.
at sun.net.www.protocol.https.HttpsClient.checkURLSpoofing
....
Este es un código que ha funcionado en el pasado pero ya no. Ha habido algunos cambios en la arquitectura del sistema, pero necesito obtener más datos antes de acercarme a los responsables.
¿Qué puede causar este error? ¿Puedo desactivar la comprobación de URLSpoofing?
Solución
Parece que el certificado SSL para domain.com ha sido otorgado a sub.domain.com. O, más probablemente, lo que era domain.com ha cambiado de nombre a sub.domain.com sin actualizar el certificado SSL.
Otros consejos
cletus tiene razón sobre la causa probable.
También hay una forma de desactivar la comprobación de la parodia.
Puede crear un objeto que implemente HostnameVerifier que devuelve true en más circunstancias que 'usual'.
Reemplazaría el HostnameVerifier predeterminado llamando a setHostnameVerifier en el objeto de conexión en el código de la pregunta.
Esta respuesta se inspiró en: http://www.java -samples.com/showtutorial.php?tutorialid=211
Encontré ese enlace con esta consulta: http: / /www.google.com/search?q=https+hostname+wrong+should+be
Una nota más: piénselo dos veces antes de hacer esto. Creará una debilidad explotable en la seguridad entre sus componentes de cliente y servidor.
Obtuve esta excepción - java.io.IOException: HTTPS nombre de host incorrecto: debería ser < localhost >
.
Mi solución es que cambié mi certificado autofirmado y hago el CN = localhost
.
O
Agregue su certificado nombre de dominio cn = < domain-name >
a su archivo host ubicado probablemente en c: / windows / system32 / drivers / etc /...
El siguiente código resolvió mi 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;
}
});
}
Utilice el nombre de host (nombre de DNS) como nombre de alias.
Ej:
keytool -import -alias <google.com> -file certificate_one.cer -keystore cacerts
Java verifica de forma predeterminada que el certificado CN (Nombre común) es el mismo que el nombre de host en la URL. Si el CN en el certificado no es el mismo que el nombre de host , su cliente de servicio web falla con la siguiente excepción: java.io.IOException: HTTPS nombre de host incorrecto: debería ser el nombre de host como en los certificados.