2010-07-13 15 views
7

Tengo algunos recursos a los que debo acceder con SSL que utiliza certificados autofirmados. En general, la mayoría de las herramientas tienen una configuración simple para permitir el acceso sin errores o solo una advertencia. Sin embargo, parece que la forma correcta de hacerlo con la JVM es importar el certificado de firma a un almacén de claves como una CA.¿Cómo usar SSL con un certificado autofirmado en groovy?

Tengo un script maravilloso que me gustaría usar, pero preferiría que mi script funcione de manera independiente en cualquier JVM sin modificar el keystore o distribuir un nuevo keystore. ¿Hay una manera simple de anular la verificación de certificación?

Respuesta

17

Después de un poco de investigación, me encontré con this post. Esto es lo que terminé usando:

import javax.net.ssl.HostnameVerifier 
import javax.net.ssl.HttpsURLConnection 
import javax.net.ssl.SSLContext 
import javax.net.ssl.TrustManager 
import javax.net.ssl.X509TrustManager 

def nullTrustManager = [ 
    checkClientTrusted: { chain, authType -> }, 
    checkServerTrusted: { chain, authType -> }, 
    getAcceptedIssuers: { null } 
] 

def nullHostnameVerifier = [ 
    verify: { hostname, session -> true } 
] 

SSLContext sc = SSLContext.getInstance("SSL") 
sc.init(null, [nullTrustManager as X509TrustManager] as TrustManager[], null) 
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()) 
HttpsURLConnection.setDefaultHostnameVerifier(nullHostnameVerifier as HostnameVerifier) 

Utilice bajo su propio riesgo: esto subvierte la verificación del certificado!

+3

En general, hvgotcodes es una mejor solución. Su kilometraje puede variar, por supuesto. El problema con su solución es que todos los hosts ahora son válidos, en lugar de solo los pocos que realmente pretende dejar pasar. Si su código está estrictamente controlado, y está seguro de que solo se conectará a fuentes "de confianza", estará bien. Sin embargo, usted es vulnerable a la dirección equivocada de DNS y a cualquier cantidad de otros problemas de los que estaría protegido si importa sus certificados en un almacén de confianza. También puede establecer la propiedad javax.net.ssl.trustStore en tiempo de ejecución, si tiene un comportamiento más dinámico. –

+0

En general, estoy de acuerdo. Pero existen ciertos contextos de scripting en los que es agradable ignorar por completo la administración de certificados; por ejemplo, donde los servidores de prueba se generan dinámicamente y los almacenes de claves de los clientes tendrían que mantenerse continuamente sincronizados. También vale la pena señalar que otros lenguajes dinámicos como ruby ​​y python hacen de esto una configuración de configuración simple y no imponen la cadena de certificados por defecto, respectivamente. – ataylor

+2

Solo para poner esto en negrita para los lectores que copian/pegan sin pasar por el comentario de @ BrianM.Carr: ** esta solución deshabilita por completo los pasos de verificación del certificado, haciendo que la conexión sea potencialmente vulnerable a los ataques MITM **. – Bruno

7

solo tuve que pasar por esto con una aplicación de Grails en la que estoy trabajando. Solo tratará con el almacén de claves una vez. Suponiendo que tiene el certificado, simplemente colóquelo en su almacén de claves, luego apunte su JVM al almacén de claves a través de los apoyos de la línea de comandos ...

editar - no sé de ninguna manera para eludir la necesidad del almacén de claves. Pero puedes crear uno solo con los certificados que necesitas y pasarlo con tu aplicación. Solo lo haces una vez

editar editar - aquí es el comando para la herramienta de claves Java y la CL apuntalar

keytool -import -trustcacerts -alias www.the-domain.com -file the-cert.der -keystore store.jks 

-Djavax.net.ssl.trustStore=/path/to/store.jks 
-4

Si se llama al programa de línea de comandos curl en lugar de utilizar las herramientas maravilloso/JVM nativos, que podría desactivar comprobación de certificados para su usuario ejecutando lo siguiente desde la línea de comandos:

$ echo 'insecure' >>~/.curlrc 
+1

Esta publicación se trata en meta: http://meta.stackoverflow.com/questions/266368/why-this-post-is-not-very-low-quality –

+2

@staticx, además, es particularmente insegura porque afectará a ** todas ** las conexiones hechas usando 'curl' por ese usuario. – Bruno

+0

@staticx Hmm, tienes razón, eso es probablemente lo que está sugiriendo. Respuesta revisada – ataylor

Cuestiones relacionadas