2016-12-06 1 views
0

J'essaie de faire une demande de publication HTTPS.Comment faire HTTPS post demande en Java?

String url = "https://myhttpsurl.com" 
URL myurl = new URL(url); 
HttpsURLConnection con = (HttpsURLConnection) myurl.openConnection(); 
con.setRequestMethod("POST"); 
String query = "confirmation_number=" + URLEncoder.encode(confNumber, "UTF-8"); 
con.setRequestProperty("Content-length",String.valueOf(query.length())); 
con.setRequestProperty("Content-Type","application/x-www-form-urlencoded"); 
con.setDoOutput(true); 
con.setDoInput(true); 

DataOutputStream output = new DataOutputStream(con.getOutputStream()); 
output.writeBytes(query); 

output.close(); 
System.out.println("Resp Code:"+con.getResponseCode()); 

Je reçois l'erreur suivante:

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 sun.security.ssl.Alerts.getSSLException(Alerts.java:192) at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1904) at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:279) at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:273) at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1446) at sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:209) at sun.security.ssl.Handshaker.processLoop(Handshaker.java:913) at sun.security.ssl.Handshaker.process_record(Handshaker.java:849) at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1023) at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1332) at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1359) at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1343) at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:559) at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:185) at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:1092) at sun.net.www.protocol.https.HttpsURLConnectionImpl.getOutputStream(HttpsURLConnectionImpl.java:250)

S'il vous plaît suggérer ce qui provoque l'erreur

+1

Il n'a pas demandé comment ignorer quoi que ce soit, et à condition de le dupliquer, il l'expose simplement à une faille de sécurité. Très mauvais choix de doublons, les gars. – EJP

Répondre

2

Java n'est pas en mesure de vérifier la validité du certificat SSL sur le serveur https. Il est auto-signé ou signé par une autorité de certification inconnue de l'environnement d'exécution Java.

Vos options consistent à approuver manuellement le certificat en l'ajoutant au fichier de clés certifiées (cacerts) ou pour que votre certificat soit signé. Je ne recommande pas de désactiver complètement la validation du certificat SSL, car vous pourriez vous exposer à des conséquences inattendues.

+2

Voici un bon exemple de la façon de faire cela: http://stackoverflow.com/a/36427118/2464657 – Adam

+1

Cela semble bien, mais comme indiqué, ils devraient le faire à nouveau lorsque le JRE est remplacé. Je recommande toujours de faire votre propre fichier cacerts, copié à partir du JRE, puis importer et lui faire confiance. Définissez ensuite la propriété système "javax.net.ssl.trustStore". Six à un, une demi-douzaine à l'autre ... de toute façon, c'est un peu de travail pour que le décor ne soit pas perdu. –

+0

D'accord Je pense juste que l'importation directe dans le JRE est un peu plus simple pour les débutants. Mais comme vous l'avez dit, les deux sont valides. – Adam