Saltar al contenido

Acepte el certificado ssl autofirmado del servidor en el cliente Java

Solución:

Tiene básicamente dos opciones aquí: agregar el certificado autofirmado a su almacén de confianza de JVM o configurar su cliente para

Opción 1

Exporte el certificado desde su navegador e impórtelo en su almacén de confianza de JVM (para establecer una cadena de confianza):

<JAVA_HOME>binkeytool -import -v -trustcacerts
-alias server-alias -file server.cer
-keystore cacerts.jks -keypass changeit
-storepass changeit 

opcion 2

Deshabilitar la validación de certificados:

// Create a trust manager that does not validate certificate chains
TrustManager[] trustAllCerts = new TrustManager[] { 
    new X509TrustManager() {     
        public java.security.cert.X509Certificate[] getAcceptedIssuers() { 
            return new X509Certificate[0];
        } 
        public void checkClientTrusted( 
            java.security.cert.X509Certificate[] certs, String authType) {
            } 
        public void checkServerTrusted( 
            java.security.cert.X509Certificate[] certs, String authType) {
        }
    } 
}; 

// Install the all-trusting trust manager
try {
    SSLContext sc = SSLContext.getInstance("SSL"); 
    sc.init(null, trustAllCerts, new java.security.SecureRandom()); 
    HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
} catch (GeneralSecurityException e) {
} 
// Now you can access an https URL without having the certificate in the truststore
try { 
    URL url = new URL("https://hostname/index.html"); 
} catch (MalformedURLException e) {
} 

Tenga en cuenta que No recomiendo la Opción # 2 en absoluto. La desactivación del administrador de confianza anula algunas partes de SSL y lo hace vulnerable a los ataques de intermediarios. Prefiera la Opción # 1 o, mejor aún, que el servidor use un certificado “real” firmado por una CA conocida.

Existe una alternativa mejor a confiar en todos los certificados: cree un TrustStore que confía específicamente en un certificado determinado y lo usa para crear un SSLContext de donde sacar el SSLSocketFactory para establecer en el HttpsURLConnection. Aquí está el código completo:

File crtFile = new File("server.crt");
Certificate certificate = CertificateFactory.getInstance("X.509").generateCertificate(new FileInputStream(crtFile));

KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
keyStore.load(null, null);
keyStore.setCertificateEntry("server", certificate);

TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
trustManagerFactory.init(keyStore);

SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, trustManagerFactory.getTrustManagers(), null);

HttpsURLConnection connection = (HttpsURLConnection) new URL(url).openConnection();
connection.setSSLSocketFactory(sslContext.getSocketFactory());

Alternativamente, puede cargar el KeyStore directamente desde un archivo o recupere el certificado X.509 de cualquier fuente confiable.

Tenga en cuenta que con este código, los certificados en cacerts no se utilizará. Este particular HttpsURLConnection solo confiará en este certificado específico.

Apache HttpClient 4.5 admite la aceptación de certificados autofirmados:

SSLContext sslContext = SSLContexts.custom()
    .loadTrustMaterial(new TrustSelfSignedStrategy())
    .build();
SSLConnectionSocketFactory socketFactory =
    new SSLConnectionSocketFactory(sslContext);
Registry<ConnectionSocketFactory> reg =
    RegistryBuilder.<ConnectionSocketFactory>create()
    .register("https", socketFactory)
    .build();
HttpClientConnectionManager cm = new PoolingHttpClientConnectionManager(reg);        
CloseableHttpClient httpClient = HttpClients.custom()
    .setConnectionManager(cm)
    .build();
HttpGet httpGet = new HttpGet(url);
CloseableHttpResponse sslResponse = httpClient.execute(httpGet);

Esto crea una fábrica de sockets SSL que utilizará el TrustSelfSignedStrategy, lo registra con un administrador de conexión personalizado y luego realiza un HTTP GET usando ese administrador de conexión.

Estoy de acuerdo con aquellos que cantan “no hagas esto en producción”, sin embargo, hay casos de uso para aceptar certificados autofirmados fuera de producción; los usamos en pruebas de integración automatizadas, por lo que estamos usando SSL (como en producción) incluso cuando no se ejecuta en el hardware de producción.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *