java: ignore el certificado ssl caducado

URL myUrl = new URL("https://www....."); 

El certificado SSL del sitio web ha expirado. ¿Cómo evitarlo y hacer que funcione URL ()?

Debe comstackr un TrustManager que envuelva al administrador de confianza predeterminado, capture la TrustManager CertificiateExpiredException y la ignore.

Nota: como se detalla en esta respuesta , si esto es seguro depende mucho de la implementación. En particular, se basa en la última validación de la fecha, después de que todo lo demás se haya verificado correctamente.

Algo en esta línea debería funcionar:

 TrustManagerFactory tmf = TrustManagerFactory.getInstance( TrustManagerFactory.getDefaultAlgorithm()); // Initialise the TMF as you normally would, for example: tmf.init((KeyStore)null); TrustManager[] trustManagers = tmf.getTrustManagers(); final X509TrustManager origTrustmanager = (X509TrustManager)trustManagers[0]; TrustManager[] wrappedTrustManagers = new TrustManager[]{ new X509TrustManager() { public java.security.cert.X509Certificate[] getAcceptedIssuers() { return origTrustmanager.getAcceptedIssuers(); } public void checkClientTrusted(X509Certificate[] certs, String authType) { origTrustmanager.checkClientTrusted(certs, authType); } public void checkServerTrusted(X509Certificate[] certs, String authType) { try { origTrustmanager.checkServerTrusted(certs, authType); } catch (CertificateExpiredException e) {} } } }; SSLContext sc = SSLContext.getInstance("TLS"); sc.init(null, wrappedTrustManagers, null); HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); 

Los administradores de confianza lanzan CertificateException s (ver subclases para más detalles) cuando algo está mal con un certificado. Sea específico en lo que quiere atrapar / ignorar. Todo lo que realmente quiere validado debe verificarse antes de que lo que atrape sea potencialmente lanzado, o tendrá que validarlo manualmente también. Cualquier cosa más relajada que esto (en particular, no hacer nada y, por lo tanto, no arrojar ninguna excepción) ignorará por completo la verificación y validación del certificado, que es casi lo mismo que utilizar conjuntos de cifrado anónimos o ignorar la autenticación. Esto vencería el propósito de seguridad de usar SSL / TLS (en lugar de ser solo un poco más flexible en la fecha de vencimiento).

Debe crear un validador X509 personalizado que ignorará los certificados vencidos. De hecho, no se realizará ninguna verificación.

Código tomado de aquí: http://exampledepot.com/egs/javax.net.ssl/TrustAll.html

 // Create a trust manager that does not validate certificate chains TrustManager[] trustAllCerts = new TrustManager[]{ new X509TrustManager() { public java.security.cert.X509Certificate[] getAcceptedIssuers() { return null; } 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 (Exception e) { } // Now you can access an https URL without having the certificate in the truststore // It should work with expired certificate as well try { URL myUrl = new URL("https://www....."); } catch (MalformedURLException e) { } 

Escribí un TrustManager personalizado para resolver este problema, puedes verlo en https://gist.github.com/divergentdave/9a68d820e3610513bd4fcdc4ae5f91a1 . Este TrustManager envuelve el X509Certificate ofensor en otra clase para deshabilitar la comprobación de caducidad y deja el rest de la validación en su lugar. (es decir, coincide con el nombre de host, las cadenas a una CA de confianza, la firma válida, etc.)