2016-12-06 76 views
0

我正在嘗試發出HTTPS發佈請求。如何在Java中創建HTTPS發佈請求?

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是無法覈實的HTTPS服務器上的SSL證書的有效性。它是自簽名的或由Java運行時未知的證書頒發機構簽署的。

您的選擇是手動信任證書,方法是將證書添加到信任庫(cacerts),或者簽署證書。我不建議完全禁用SSL證書驗證,因爲您可能會面對意想不到的後果。

+2

下面是如何做到這一點的一個很好的例子:http://stackoverflow.com/a/36427118/2464657 – Adam

+1

看起來不錯,但如上所述,他們不得不再次做到這一點時,JRE被取代。我總是建議您製作自己的cacerts文件,從JRE複製,然後導入並信任它。然後設置系統屬性「javax.net.ssl.trustStore」。六比一到另一半,這兩種方式都是爲了讓環境不會丟失。 –

+0

同意我只是認爲直接導入JRE對於初學者來說更簡單一些。但正如你所說,兩者都是有效的。 – Adam