2012-08-08 20 views
8

Actualmente estoy anulando X509TrustManager para permitir que todos los certs sean temporalmente una 'solución' (algo inseguro). Estoy tratando de descubrir cómo voy a agregar, así que acepta solo un cert específico con el que estoy teniendo problemas hasta que se pueda hacer una corrección adecuada (que está fuera de mis manos en este momento). Aquí está el código actual.X509TrustManager ¿Invalidar sin permitir TODOS los certificados?

TrustManager[] trustAllCerts = new TrustManager[]{new X509TrustManager() { 
    @Override 
    public java.security.cert.X509Certificate[] getAcceptedIssuers() { 
     return null; 
    } 

    @Override 
    public void checkClientTrusted(java.security.cert.X509Certificate[] certs, String authType) { 
    } 

    @Override 
    public void checkServerTrusted(java.security.cert.X509Certificate[] certs, String authType) { 
    } 
}}; 

try { 
    SSLContext sc = SSLContext.getInstance("SSL"); 
    sc.init(null, trustAllCerts, new java.security.SecureRandom()); 
    HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); 
} catch (GeneralSecurityException e) { 
    System.out.println(e.getStackTrace()); 
} 
+0

¿por qué devolver nulo en lugar de una matriz vacía? la especificación dice que devuelva una matriz no nula. – Jayen

Respuesta

7

Todo lo que tiene que hacer es devolver el certificado desde getAcceptedIssuers. Ver this

InputStream inStream = new FileInputStream("fileName-of-cert"); 
CertificateFactory cf = CertificateFactory.getInstance("X.509"); 
X509Certificate cert = (X509Certificate)cf.generateCertificate(inStream); 
inStream.close(); 

y luego volver que en una matriz dentro del método

+0

¿Puedo devolver un certificado que recibo de una URL a la que me conecto? En este momento, solo recibo los errores de certificado cuando voy a otra URL en otro servidor que está dando los errores del certificado. – user1015523

+0

Lo que he hecho es usar un navegador para desplegar el certificado del sitio a través del navegador (cuando vea el error, debe haber una opción en cada navegador importante para guardarlo en el disco) y luego agregarlo a la clave almacenar como dice StephenC o usar el código anterior del archivo. La solución anterior puede ser un poco menos dolorosa (aunque menos flexible) porque IIRC generar almacenes de claves es un poco tedioso. – dfb

+1

Si openssl está disponible, la cadena de certificados se puede descargar en la línea de comandos: openssl s_client -host www.webservicehost.com -port 443 -showcerts> output_certificate.crt – IcedDante

0

Una posibilidad sería añadir temporalmente el certificado problemática de almacén de claves de la JVM como un certificado de confianza.