東莞公司網(wǎng)站價格競價托管服務(wù)多少錢
? ? ? ?使用httpclient對接多個第三方應(yīng)用,云服務(wù)形式的接口都沒有問題,唯獨一家私有部署的系統(tǒng),死活握不了手。對方的系統(tǒng)用瀏覽器訪問無誤(https)。程序訪問就是不行:
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:1747)
?? ?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:1209)
?? ?at com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:135)
?? ?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:943)
?? ?at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1188)
?? ?at com.sun.net.ssl.internal.ssl.SSLSocketImpl.writeRecord(SSLSocketImpl.java:654)
?? ?at com.sun.net.ssl.internal.ssl.AppOutputStream.write(AppOutputStream.java:100)
?? ?at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:65)
?? ?at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:123)
?? ?at org.apache.commons.httpclient.methods.StringRequestEntity.writeRequest(StringRequestEntity.java:150)
?? ?at org.apache.commons.httpclient.methods.EntityEnclosingMethod.writeRequestBody(EntityEnclosingMethod.java:495)
?? ?at org.apache.commons.httpclient.HttpMethodBase.writeRequest(HttpMethodBase.java:1973)
?? ?at org.apache.commons.httpclient.HttpMethodBase.execute(HttpMethodBase.java:993)
?? ?at org.apache.commons.httpclient.HttpMethodDirector.executeWithRetry(HttpMethodDirector.java:397)
?? ?at org.apache.commons.httpclient.HttpMethodDirector.executeMethod(HttpMethodDirector.java:170)
?? ?at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:396)
?? ?at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:324)
奇怪的是同一個程序訪問其他家的https接口就沒有。
其實核心原因很簡單,就是java的自身證書庫里沒有他們家的。按如下步驟操作即可解決問題
1、找對方要證書,例如server.cer
2、復(fù)制到$JAVA_HOME/jre/lib/security/目錄下
3、執(zhí)行keytool -import -alias mycert -file ./server.cer -keystore ./cacerts -storepass changeit
其中changeit是java證書文件默認(rèn)訪問密碼,如果改過就需要搜索自己的腦子了。
操作后,重啟程序,問題OK