validar una solicita sistema servidor revocación revocacion revoca restricciones realizar puede podido para listas lista iniciar idse firma error ejecutara crl conexión comprobar comprobacion certificados certificado aplicacion acceso java web-services ssl self-signed method-overriding

una - Java: función de anulación para deshabilitar la comprobación del certificado SSL



no se puede realizar una comprobacion de revocacion para el certificado (3)

El servicio web descansa sobre SSL y tiene un certificado autofirmado, alojado en un sistema remoto. Ya he creado un cliente que accede a ese servicio web. Esto se hace agregando el certificado al almacén de claves programáticamente .

Ahora escuché eso, no es necesario agregar un certificado al almacén de claves para acceder a un servicio web autofirmado. En su lugar, podemos deshabilitar la verificación del certificado anulando algunos métodos. ¿Es esto cierto? ¿Cuáles son esos métodos? Por favor ayuda.


Esto debería ser suficiente. Utilizo esto cuando pruebo el código en pruebas y servidores de etapas donde no tenemos certificados debidamente firmados. Sin embargo, realmente debería considerar la posibilidad de obtener un certificado SSL válido en su servidor de producción . Nadie quiere ser escuchado y se ha violado su privacidad.

SSLContext sc = SSLContext.getInstance("TLS"); sc.init(null, new TrustManager[] { new TrustAllX509TrustManager() }, new java.security.SecureRandom()); HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); HttpsURLConnection.setDefaultHostnameVerifier( new HostnameVerifier(){ public boolean verify(String string,SSLSession ssls) { return true; } });

Y esto.

import javax.net.ssl.X509TrustManager; import java.security.cert.X509Certificate; /** * DO NOT USE IN PRODUCTION!!!! * * This class will simply trust everything that comes along. * * @author frank * */ public class TrustAllX509TrustManager implements X509TrustManager { public 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) { } }

¡La mejor de las suertes!

=== ACTUALIZACIÓN ===

Solo quería señalar que hay un servicio llamado Let''s Encrypt que automatiza el proceso de generación y configuración de certificados SSL / TLS reconocidos por prácticamente todo el mundo, ¡y es absolutamente gratis!


Ignorar certificados por conexión es mucho más seguro ya que cualquier otro código seguirá utilizando los valores predeterminados de seguridad.

El siguiente código:

  • Anula el administrador de confianza y el verificador de nombre de host por conexión.
  • Reutiliza SSLSocketFactory para admitir conexiones persistentes, evitando el costoso protocolo de enlace SSL para solicitudes repetidas al mismo servidor.

Como han indicado otros, esto solo debe usarse para realizar pruebas y / o para sistemas internos que se comunican con otros sistemas internos.

import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; import java.security.KeyManagementException; import java.security.NoSuchAlgorithmException; import java.security.cert.X509Certificate; import javax.net.ssl.HostnameVerifier; import javax.net.ssl.HttpsURLConnection; import javax.net.ssl.SSLContext; import javax.net.ssl.SSLSession; import javax.net.ssl.SSLSocketFactory; import javax.net.ssl.TrustManager; import javax.net.ssl.X509TrustManager; public class TestPersistentConnection { private static SSLSocketFactory sslSocketFactory = null; /** * Use the VM argument <code>-Djavax.net.debug=ssl</code> for SSL specific debugging; * the SSL handshake will appear a single time when connections are re-used, and multiple * times when they are not. * * Use the VM <code>-Djavax.net.debug=all</code> for all network related debugging, but * note that it is verbose. * * @throws Exception */ public static void main(String[] args) throws Exception { //URL url = new URL("https://google.com/"); URL url = new URL("https://localhost:8443/"); // Disable first request(url, false); // Enable; verifies our previous disable isn''t still in effect. request(url, true); } public static void request(URL url, boolean enableCertCheck) throws Exception { BufferedReader reader = null; // Repeat several times to check persistence. System.out.println("Cert checking=["+(enableCertCheck?"enabled":"disabled")+"]"); for (int i = 0; i < 5; ++i) { try { HttpURLConnection httpConnection = (HttpsURLConnection) url.openConnection(); // Normally, instanceof would also be used to check the type. if( ! enableCertCheck ) { setAcceptAllVerifier((HttpsURLConnection)httpConnection); } reader = new BufferedReader(new InputStreamReader(httpConnection.getInputStream()), 1); char[] buf = new char[1024]; StringBuilder sb = new StringBuilder(); int count = 0; while( -1 < (count = reader.read(buf)) ) { sb.append(buf, 0, count); } System.out.println(sb.toString()); reader.close(); } catch (IOException ex) { System.out.println(ex); if( null != reader ) { reader.close(); } } } } /** * Overrides the SSL TrustManager and HostnameVerifier to allow * all certs and hostnames. * WARNING: This should only be used for testing, or in a "safe" (i.e. firewalled) * environment. * * @throws NoSuchAlgorithmException * @throws KeyManagementException */ protected static void setAcceptAllVerifier(HttpsURLConnection connection) throws NoSuchAlgorithmException, KeyManagementException { // Create the socket factory. // Reusing the same socket factory allows sockets to be // reused, supporting persistent connections. if( null == sslSocketFactory) { SSLContext sc = SSLContext.getInstance("SSL"); sc.init(null, ALL_TRUSTING_TRUST_MANAGER, new java.security.SecureRandom()); sslSocketFactory = sc.getSocketFactory(); } connection.setSSLSocketFactory(sslSocketFactory); // Since we may be using a cert with a different name, we need to ignore // the hostname as well. connection.setHostnameVerifier(ALL_TRUSTING_HOSTNAME_VERIFIER); } private static final TrustManager[] ALL_TRUSTING_TRUST_MANAGER = new TrustManager[] { new X509TrustManager() { public X509Certificate[] getAcceptedIssuers() { return null; } public void checkClientTrusted(X509Certificate[] certs, String authType) {} public void checkServerTrusted(X509Certificate[] certs, String authType) {} } }; private static final HostnameVerifier ALL_TRUSTING_HOSTNAME_VERIFIER = new HostnameVerifier() { public boolean verify(String hostname, SSLSession session) { return true; } }; }

Muchas gracias a: http://runtime32.blogspot.com/2008/11/let-java-ssl-trust-all-certificates.html


TrustManager[] trustAllCerts = new TrustManager[] {new X509TrustManager() { public java.security.cert.X509Certificate[] getAcceptedIssuers() { return null; } public void checkClientTrusted(X509Certificate[] certs, String authType) { } public void checkServerTrusted(X509Certificate[] certs, String authType) { } } }; SSLContext sc = SSLContext.getInstance("SSL"); sc.init(null, trustAllCerts, new java.security.SecureRandom()); HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); HostnameVerifier allHostsValid = new HostnameVerifier() { public boolean verify(String hostname, SSLSession session) { return true; } }; HttpsURLConnection.setDefaultHostnameVerifier(allHostsValid); GetCustomerPhone http = new GetCustomerPhone(); System.out.println("Processing.."); try{ http.sendPost(); } catch(Exception e){ e.printStackTrace(); } }

Creo que funcionará bien. Porque está bien de mí ...