Pregunta

Implementé un servicio web con autenticación de servidor y cliente usando keytool.El problema es que esta autenticación no funciona si no incluyo el nombre del host.Por ejemplo:

keytool -genkey -alias myAlias -keyalg RSA -keypass myPassword -storepass myPassword -keystore my.keystore -dname "CN=myhost"

Pero no necesito y no me gusta la validación por host o por IP.¿Hay alguna forma de evitarlo?

Gracias.

¿Fue útil?

Solución

SSL tiene, como parte de sus requisitos, la validación de que el certificado CN coincida con el nombre de host al que se está conectando.Si el CN ​​no coincide, el navegador asumirá que se está conectando al host y al objeto incorrectos.

No hay forma de evitar esto.

Otros consejos

Estoy de acuerdo con los otros carteles: si estás usando SSL, es casi seguro que desear Verificación del nombre de host como parte del conjunto de características de seguridad SSL.

Dicho esto, dependiendo del cliente que esté utilizando, puede haber una forma de evitar este problema. Los ingenieros evitarán la verificación del nombre de host en entornos de prueba, para la depuración, la creación de prototipos, etc. Si está utilizando un cliente Java que se conecta a través de HttpsurlConnection, sería tan simple como agregar lo siguiente a su clase de cliente:

static {
    HttpsURLConnection.setDefaultHostnameVerifier( 
        new HostnameVerifier(){
            public boolean verify(String string,SSLSession ssls) {
            return true;
        }
    });
}

El punto de usar SSL/TLS es para que el cliente pueda estar seguro de que se está conectando al servicio correcto, y no a algún servicio falso que intente hacerse pasar por el real. Si (hipotéticamente) el certificado del servidor no contenía ninguna información de identificación del host, el cliente si el servidor con el que estaba negociando era el correcto.

De hecho, tu Necesito validación por dirección DNS, porque si no lo hace, su validación SSL no tiene valor. (O al menos, en ninguna parte tan seguro como podría ser).

Supongo que, en teoría, podría intentar hacer la comunicación de su cliente/servidor sobre los canales asegurados por otros medios que SSL/TLS. Pero necesitaría una seria experiencia en la tecnología de seguridad y cifrado de Java.

La lógica estándar es: si no necesita proteger sus datos, no use SSL. Si necesita protegerlo, entonces necesita saber a qué host se está conectando. No debe haber intermedio.

Sin embargo, en algunos entornos internos, es posible que tenga suficiente control de la red y la configuración para no preocuparse.

Si está en el último caso, la solución depende de las bibliotecas del cliente que está utilizando. Si está utilizando el cliente HTTP, lea el Guía de configuración SSL. Puede ser que no necesite implementar el suyo SecureProtocolSocketFactory y solo puede usar EasysslProtocolsocketFactory.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top