2012-09-13 6 views
1

Mon programme Java utilise l'adresse brute de GitHub pour accéder à un fichier de version afin d'obtenir la dernière version. Cette adresse est au format https://raw.github.com/user/repository/branch/version_fileTéléchargement de fichiers via HTTPS avec certificat SSL non vérifié

Lors des phases d'essai, j'ai eu aucun problème en utilisant ce avec le code suivant:

currentVersion = new Version(plugin.getDescription().getVersion()); 

URL url = new URL("https://raw.github.com/zonedabone/CommandSigns/master/VERSION"); 
URLConnection connection = url.openConnection(); 
BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream())); 
newestVersion = new Version(in.readLine()); 

if (currentVersion.compareTo(newestVersion) < 0) 
    newAvailable = true; 

Cependant, certains utilisateurs se sont plaints de l'erreur suivante:

sun.security.validator.ValidatorException: 
    PKIX path building failed: 
    sun.security.provider.certpath.SunCertPathBuilderException: 
     unable to find valid certification path to requested target 

Java se plaint de ne pouvoir valider le certificat SSL. Le certificat de GitHub est vérifié par DigiCert, mais apparemment, certaines versions de Java ne l'identifieront pas. J'ai lu il ya deux façons de surmonter ceci: ajouter le certificat au TrustStore et désactiver la validation tout à fait. Les réponses suggérées sur StackOverflow utilisent soit un TrustStore autorisant tout, ce qui serait une très mauvaise idée étant donné qu'il n'est pas dans les limites d'un 'environnement de test', ou si elles montrent comment ajouter le certificat, elles lien vers une page web cassée.

Quelqu'un peut-il fournir de nouvelles informations?

+0

Cette question a été posée et répond _countless_ fois sur SO et sur le web en général. Veuillez faire une recherche Google sur "certificat auto-signé java" et supprimer cette question. –

+0

duplicata possible de [Comment accepter un certificat auto-signé avec une connexion Java HttpsURLConnection?] (Http://stackoverflow.com/questions/859111/how-do-i-accept-a-self-signed-certificate-with -java-httpsurlconnection) –

+0

@JimGarrison, vrai, malheureusement que google recherche mènera à un certain nombre de réponses qui suggèrent d'utiliser un gestionnaire de confiance qui fait confiance à tout cert ... – Bruno

Répondre

4

D'abord la théorie ... Comme le dit JSSE Reference Guide:

IMPORTANT NOTE: The JDK ships with a limited number of trusted root certificates in the /lib/security/cacerts file. As documented in keytool, it is your responsibility to maintain (that is, add/remove) the certificates contained in this file if you use this file as a truststore.

Depending on the certificate configuration of the servers you contact, you may need to add additional root certificate(s). Obtain the needed specific root certificate(s) from the appropriate vendor.

Les utilisateurs doivent maintenir la liste des CA certificats eux-mêmes. Un certain nombre de personnes ne sauront pas comment le faire, malheureusement. Ils pourraient utiliser le fichier cacerts d'un autre JRE (plus récent) dans leur propre installation.

Vous pouvez utiliser un gestionnaire de confiance qui fait confiance à n'importe quel certificat et l'utilise spécifiquement pour cette connexion, mais ce n'est pas une bonne idée, car cela ouvre la connexion aux attaques potentielles MITM. Il y a assez d'exemples de code pour cette solution non sécurisée. La meilleure solution, si vous souhaitez faire confiance à un certificat spécifique, est de le charger correctement à l'aide d'un fichier de clés certifiées spécifique, comme décrit dans this answer. Vous pouvez même charger ce magasin de confiance à partir d'un InputStream à partir du classloader si vous souhaitez l'intégrer à votre application.

Vous pouvez également, dans la mesure du possible, utiliser directement le Trust Trust du système d'exploitation. Sous Windows, vous pouvez charger le magasin de clés Windows-ROOT comme décrit dans this article. Sur OSX, vous pouvez charger un KeychainStore.

+0

La première solution que vous avez suggéré semble tout à fait raisonnable. Je suis maintenant parti pour une semaine, donc je vais devoir laisser l'autre développeur de plugin jeter un coup d'œil avant de l'accepter. La seconde réponse ne serait pas possible car le plugin n'est pas dépendant du système d'exploitation. – CJxD

-2

Vous pouvez mettre en œuvre un HttpsURLConnection avec "tous" -TrustManager

comme http://bitsandcodes.blogspot.de/2010/08/create-trust-manager-that-trust-all-ssl.html

+0

Y a-t-il de meilleurs exemples? Celui-ci utilise des types obsolètes tels que SSLContext et utilise JSSESocketFactory qui ne peut pas être résolu dans mon IDE. – CJxD

+0

Edit: les types ne sont pas dépréciés, je faisais juste les fausses importations. Cependant, je ne peux toujours pas utiliser JSSESocketFactory car je n'utilise pas org.apache. – CJxD

+0

Ce 'JSSESocketFactory' est spécifique à Axis, ce qui n'a rien à voir avec la question. De plus, c'est une mauvaise idée de faire confiance aveuglément à tous les certificats. – Bruno

Questions connexes