Comment ignorer PKIX chemin d'accès du bâtiment a échoué: le soleil.de sécurité.fournisseur de.certpath.SunCertPathBuilderException?
Je suis l'exception suivante lorsque vous essayez de poster une demande à un serveur http:
Voici le code que j'ai utilisé
URL url = new URL(
"https://www.abc.com");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setDoOutput(true);
DataOutputStream wr = new DataOutputStream(conn.getOutputStream());
//wr.writeBytes(params);
wr.flush();
wr.close();
BufferedReader br = new BufferedReader(new InputStreamReader(
conn.getInputStream()));
String line = null;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
Ici est l'exception:
Exception in thread "main" javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:174)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1731)
at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:241)
at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:235)
at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1206)
at com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:136)
at com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Handshaker.java:593)
at com.sun.net.ssl.internal.ssl.Handshaker.process_record(Handshaker.java:529)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:925)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1170)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1197)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1181)
at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:434)
at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:166)
at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:1014)
at sun.net.www.protocol.https.HttpsURLConnectionImpl.getOutputStream(HttpsURLConnectionImpl.java:230)
at com.amazon.mzang.tools.httpchecker.CategoryYank.getPV(CategoryYank.java:32)
at com.amazon.mzang.tools.httpchecker.CategoryYank.main(CategoryYank.java:18)
Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:323)
at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:217)
at sun.security.validator.Validator.validate(Validator.java:218)
at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:126)
at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:209)
at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:249)
at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1185)
... 13 more
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:174)
at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:238)
at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:318)
... 19 more
Le serveur n'est pas détenue par moi. Est-il possible d'ignorer cette exception?
- Ne négligez pas cette exception. Importer le certificat (après une vérification manuelle) dans votre magasin de confiance. En ignorant les erreurs de certificat qui rend la connexion vulnérable à des attaques de type MITM.
- Il y a des moments quand la confiance n'est pas important pour le client, mais https a été utilisé par le serveur n'en est pas moins.
Vous devez vous connecter pour publier un commentaire.
Si vous souhaitez ignorer le certificat tous ensemble, puis prendre un coup d'oeil à la réponse ici: Ignorer ssl auto-signé cert à l'aide de Jersey Client
Bien que cela rendra votre application vulnérable à man-in-the-middle attaques.
Ou, essayez d'ajouter le cert à votre java magasin de confiance cert.
Ce site peut être utile.
http://blog.icodejava.com/tag/get-public-key-of-ssl-certificate-in-java/
Voici un autre thread montrant comment ajouter un cert à votre magasin.
Java connexion SSL, ajoutez le serveur cert à keystore par programmation
La clé est:
J'ai utilisé le code ci-dessous pour remplacer le protocole SSL vérification dans mon projet et il a travaillé pour moi.
sc.init()
, le troisième argument peut êtrenull
. (Une valeur par défaut seront fournis.)Ensemble
validateTLSCertificates
propriétéfalse
pour votre JSoup commande.FWIW, sur Ubuntu 10.04.2 LTS installation de la ca-certificates-java et la ca-certificates paquets résolu ce problème pour moi.
J'ai eu la même erreur lors de l'exécution de la sous printemps-démarrage + RestAssured test simple.
La seule solution dans mon cas est d'ajouter " useRelaxedHTTPSValidations()'
Le test ressemble
Si vous utilisez CloudFoundry, alors vous auriez explicitement pousser le pot avec le fichier de clés ayant le certificat.