2010-07-13 6 views
7

J'ai des ressources auxquelles je dois accéder avec SSL qui utilise des certificats auto-signés. En général, la plupart des outils ont un paramètre simple pour permettre d'y accéder sans erreur ou simplement un avertissement. Cependant, il semble que la meilleure façon de le faire avec la JVM est d'importer le certificat de signature dans un fichier de clés en tant qu'autorité de certification. J'ai un script groovy que j'aimerais utiliser, mais je préférerais que mon script fonctionne de manière autonome sur n'importe quelle JVM sans modifier le keystore ou distribuer un nouveau keystore. Existe-t-il un moyen simple de contourner la vérification de certification?Comment utiliser SSL avec un certificat auto-signé dans groovy?

Répondre

17

Après un peu de recherche, j'ai trouvé this post. Voici ce que j'ai fini par utiliser:

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) 

À utiliser à vos risques et périls: cela sape la vérification du certificat!

+3

En général, hvgotcodes est une meilleure solution. Votre kilométrage peut varier, bien sûr. Le problème avec votre solution est que tous les hôtes sont maintenant valides au lieu de la poignée que vous avez l'intention de laisser passer. Si votre code est étroitement contrôlé et que vous êtes certain que vous ne vous connecterez qu'à des sources "de confiance", tout ira bien. Toutefois, vous êtes vulnérable aux erreurs de DNS et à un certain nombre d'autres problèmes à partir desquels vous seriez protégé si vous importez vos certificats dans un fichier de clés certifiées. Vous pouvez également définir la propriété javax.net.ssl.trustStore lors de l'exécution, si vous avez un comportement plus dynamique. –

+0

En général, je suis d'accord. Mais il y a certains contextes de script où il est bon d'ignorer complètement la gestion des certificats; Par exemple, lorsque les serveurs de test sont générés dynamiquement et que les keystores des clients doivent être synchronisés en permanence. Il convient également de noter que d'autres langages dynamiques tels que ruby ​​et python en font un paramètre de configuration simple et n'appliquent pas la chaîne de certificats par défaut, respectivement. – ataylor

+2

Juste pour mettre ceci en gras pour les lecteurs qui copient/collent sans passer par le commentaire @ BrianM.Carr: ** cette solution désactive complètement les étapes de vérification du certificat, rendant ainsi la connexion potentiellement vulnérable aux attaques MITM **. – Bruno

7

Je viens de passer par une application Grails sur laquelle je travaille. Vous ne traiterez le keystore qu'une seule fois. En supposant que vous avez le CERT, mettez-le simplement dans votre keystore, puis pointez votre jvm sur le keystore via les accessoires de la ligne de commande ...

edit - Je ne connais aucun moyen de contourner le keystore. Mais vous pouvez en créer un avec juste le (s) certificat (s) dont vous avez besoin et le transmettre avec votre application. Vous ne le faites qu'une seule fois.

modifier - est la commande ici pour keytool et la java CL prop

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 vous appelez le programme de ligne de commande curl plutôt que d'utiliser les outils groovy/JVM natif, vous pouvez désactiver la vérification des certificats pour votre utilisateur en exécutant la commande suivante à partir de la ligne de commande:

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

Cet article est discuté sur meta: http://meta.stackoverflow.com/questions/266368/why-this-post-is-not-very-low-quality –

+2

@staticx, en outre, il est particulièrement peu sûr car cela affectera ** toutes ** les connexions faites en utilisant curl par cet utilisateur. – Bruno

+0

@staticx Hmm, vous avez raison, c'est probablement ce qu'il suggère. Réponse révisée – ataylor

Questions connexes