Pregunta

Actualmente tengo un certificado autofirmado para mi servidor web HTTPS.

En mi programa java hay un SSLSocketFactory que creará un socket para el servidor web. La implementación predeterminada de sun bloquea el certificado autofirmado. Con una implementación propia de un X509TrustManager, solo puedo verificar si la fecha del certificado es válida.

¿Existe alguna posibilidad de permitir que la implementación predeterminada verifique la validez (fecha y nombre de host, ...), y si no muestra un diálogo para permitir que el usuario acepte este certificado?

Cada código que encontré hasta ahora solo deshabilitó la verificación SSL y aceptó todos los certificados no válidos.

¿Fue útil?

Solución

Realmente no he intentado esto, pero ¿por qué no puede implementar su propio administrador de confianza, que primero delega al administrador de confianza predeterminado para verificar si el certificado es válido y, de lo contrario, le pregunta al usuario si todavía quiere aceptar el certificado?


Puede inicializar la mayoría de las clases de seguridad con argumentos nulos para usar valores predeterminados. Para obtener el administrador de confianza predeterminado, debe obtener los administradores de confianza disponibles y elegir el primero en las matrices de mgrs para implementar la interfaz X509TrustManager . Por lo general, la matriz solo contendrá un elemento de todos modos.

TrustManagerFactory trustmanagerfactory = 
     TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
trustmanagerfactory.init((KeyStore)null);
TrustManager[] mgrs = trustmanagerfactory.getTrustManagers();

Después de envolver el administrador de confianza predeterminado con su propia extensión, debe inicializar un contexto SSL y obtener una fábrica de sockets:

SSLContext sslContext=SSLContext.getInstance("SSL","SunJSSE");
sslContext.init(null, new TrustManager[] {myTm}, null);
SSLSocketFactory sf = sslContext.getSocketFactory();

Luego use esta fábrica de sockets para crear nuevos sockets de clientes o páselos a HttpsURLConnection.setDefaultSSLSocketFactory para usar el protocolo https en URL con su propio administrador de confianza.

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