2010-07-13 19 views
7

Ho alcune risorse che devo accedere con SSL che utilizzano certificati autofirmati. In generale, la maggior parte degli strumenti ha una semplice impostazione che consente di accedervi senza errori o semplicemente un avvertimento. Tuttavia, sembra che il modo corretto per farlo con la JVM sia importare il certificato di firma in un keystore come CA.Come usare SSL con un certificato autofirmato in groovy?

Ho uno script groovy che mi piacerebbe utilizzare, ma preferirei che il mio script funzionasse in modo indipendente su qualsiasi JVM senza modificare il keystore o distribuire un nuovo keystore. C'è un modo semplice per ignorare la verifica della certificazione?

risposta

17

Dopo un po 'di ricerca, ho trovato this post. Ecco cosa ho finito per usare:

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) 

L'uso a proprio rischio: questo sovverte la verifica del certificato!

+3

In generale, hvgotcodes è una soluzione migliore. Il tuo chilometraggio può variare, ovviamente. Il problema con la tua soluzione è che ora tutti gli host sono validi anziché solo quelli che in realtà intendi far passare. Se il tuo codice è strettamente controllato e sei certo che ti collegherai solo a fonti "fidate", starai bene. Tuttavia, si è vulnerabili alla deviazione errata del DNS e a qualsiasi numero di altri problemi da cui verrebbero protetti se si importano i certificati in un truststore. È anche possibile impostare la proprietà javax.net.ssl.trustStore in fase di esecuzione, se si utilizza un comportamento più dinamico. –

+0

In generale, sono d'accordo. Ma ci sono alcuni contesti di scripting in cui è bello ignorare del tutto la gestione dei certificati; ad esempio, dove i server di test sono generati dinamicamente e i keystore dei client dovrebbero essere continuamente mantenuti sincronizzati. Vale anche la pena notare che altri linguaggi dinamici come Ruby e Python rendono questa una semplice impostazione di configurazione e non applicano la catena di certificati per impostazione predefinita, rispettivamente. – ataylor

+2

Solo per mettere questo in grassetto per i lettori che copiano/incollano senza passare attraverso il commento di @ BrianM.Carr: ** questa soluzione disabilita del tutto le fasi di verifica del certificato, rendendo così la connessione potenzialmente vulnerabile agli attacchi MITM **. – Bruno

7

ho dovuto passare attraverso questa app con un grails su cui sto lavorando. Avrai a che fare solo con il keystore una volta. Supponendo di avere il certificato, basta inserirlo nel keystore, quindi puntare il jvm nel keystore tramite puntelli a linea di comando ...

modifica - non so in alcun modo per bypassare la necessità del keystore. Ma puoi crearne uno con solo le cert (s) che ti servono e passarlo con la tua app. Lo fai solo una volta.

modifica modifica - qui è il comando per il keytool e la java cl puntellare

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

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

Se si chiama il programma da riga di comando curl piuttosto che utilizzare gli strumenti Groovy/JVM nativi, si può disattivare il controllo certificato per l'utente eseguendo il seguente dalla riga di comando:

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

Questo post è discusso su meta: http://meta.stackoverflow.com/questions/266368/why-this-post-is-not-very-low-quality –

+2

@staticx, inoltre, è particolarmente insicuro perché interesserà ** tutte ** le connessioni fatte usando 'arricciato 'da quell'utente. – Bruno

+0

@staticx Hmm, hai ragione, probabilmente è quello che sta suggerendo. Risposta modificata – ataylor

Problemi correlati