2016-12-06 10 views
0

Я пытаюсь сделать запрос на отправку HTTPS.Как сделать запрос HTTPS на 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()); 

Я получаю следующее сообщение об ошибке:

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)

Пожалуйста, укажите, что вызывает ошибку

+1

Он не спрашивал, как игнорировать что-либо, и при условии, что это дубликат просто подвергает его уязвимости безопасности. Очень плохой выбор дубликатов, ребята. – EJP

ответ

2

Java не может проверить действительность сертификата SSL на сервере HTTPS. Он либо подписан сам по себе, либо подписан сертификатом, не известным для среды выполнения Java.

Ваши возможности - доверять сертификату вручную, добавив его в доверительный магазин (cacerts) или подписав сертификат. Я не рекомендую полностью отключать проверку сертификатов SSL, так как вы можете открыть себе неожиданные последствия.

+2

Вот хороший пример того, как это сделать: http://stackoverflow.com/a/36427118/2464657 – Adam

+1

Выглядит хорошо, но, как указано, они должны будут сделать это снова, когда JRE будет заменен. Я всегда рекомендую сделать свой собственный файл cacerts, скопированный из JRE, а затем импортировать и доверять ему. Затем установите системное свойство "javax.net.ssl.trustStore". Шесть к одному, полдюжины к другому ... в любом случае это небольшая работа, чтобы не потерять настройку. –

+0

Согласен Я просто думаю, что прямой импорт в JRE немного проще для новичков. Но, как вы сказали, оба действительны. – Adam