Si desea importar el certificado de forma dinámica, es posible que necesite usar una costumbre x509TrustManager
. Esto se hace al configurar el SSLContext
, que se usa para crear el SSLSocketFactory
o el SSLEngine
.
jSSLutils es una biblioteca que le permite ajustar los administradores de confianza existentes y personalizar ciertas configuraciones. No lo necesitas, pero puede ser útil.
Esto iría a lo largo de estas líneas:
PKIXSSLContextFactory sslContextFactory = new PKIXSSLContextFactory();
sslContextFactory.setTrustManagerWrapper(new X509TrustManagerWrapper() {
@Override
public X509TrustManager wrapTrustManager(final X509TrustManager origManager) {
return new X509TrustManager() {
@Override
public X509Certificate[] getAcceptedIssuers() {
return origManager.getAcceptedIssuers();
}
@Override
public void checkServerTrusted(X509Certificate[] chain,
String authType)
throws CertificateException {
try {
// This will call the default trust manager
// which will throw an exception if it doesn't know the certificate
origManager.checkServerTrusted(chain, authType);
} catch (CertificateException e) {
// If it throws an exception, check what this exception is
// the server certificate is in chain[0], you could
// implement a callback to the user to accept/refuse
}
}
@Override
public void checkClientTrusted(X509Certificate[] chain,
String authType)
throws CertificateException {
origManager.checkClientTrusted(chain, authType);
}
};
}
});
SSLContext sslContext = sslContextFactory.buildSSLContext();
(El (PKIX)SSLContextFactory
y X509TrustManagerWrapper
provienen de jSSLutils, pero el resto está disponible con el J2SE/J2EE.)
hay algunas CertificateException
s que puede querer atrapar (ver subclases). Si realiza una devolución de llamada al usuario, es posible que la conexión SSL/TLS falle la primera vez debido a un tiempo de espera en el protocolo de enlace SSL/TLS (si la devolución de llamada tarda demasiado en ser respondida)
Podría usar este SSLContext
como su predeterminado usando SSLContext.setSSLContext(...)
(de Java 6), pero eso no es necesariamente una buena idea. Si puede, pase el SSLContext
a la biblioteca que hace la conexión SSL/TLS. Cómo se hace esto varía, pero Apache HTTP Client 4.x, por ejemplo, tiene múltiples opciones para configurar su configuración SSL, una de ellas es pasando KeyStore
s, otra al pasar SSLContext
.
También podría hacer algo por hilo en lugar de por objeto que se va a conectar (dependiente de la biblioteca), verificando el hilo actual dentro del X509TrustManager
: esto probablemente haría las cosas un poco más complejas en términos de sincronización y gestión de hilos/"conciencia" por el administrador de confianza.
Me funcionó ... Gracias – Nayeem