2016-08-03 37 views
1

當我創建一個SSL套接字是這樣的:用的createSocket HTTPS問題,連接和connectionTimeout

sslSocket = (SSLSocket) socketFactory.createSocket(host, port); 

一切正常。 socketFactorySSLSocketFactory.getDefault()。但是,我想設置連接超時。因此,我在上面行更改爲下面的代碼:

sslSocket = (SSLSocket) socketFactory.createSocket(); 
sslSocket.connect(new InetSocketAddress(host, port), connectionTimeout); 

但後來我得到了以下異常:

Exception in thread "main" jodd.http.HttpException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target; 

原因的異常:

sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target 

當我調試這個,我我們注意到在第一種情況下,代碼從請求的站點獲取所有有效的證書。在第二種情況下,這些證書丟失,因此錯誤。

還有什麼我需要添加在我的2班輪變化,使其工作像第一個單線版本?

完整堆棧跟蹤

jodd.http.HttpException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target; <--- sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target 
    at jodd.http.HttpRequest.open(HttpRequest.java:667) 
    at jodd.http.HttpRequest.open(HttpRequest.java:649) 
    at jodd.http.HttpRequest._send(HttpRequest.java:747) 
    at jodd.http.HttpRequest.send(HttpRequest.java:742) 
    at jodd.JoddHttpTest.main(JoddHttpTest.java:56) 
Caused by: 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:1949) 
    at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:302) 
    at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:296) 
    at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1509) 
    at sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:216) 
    at sun.security.ssl.Handshaker.processLoop(Handshaker.java:979) 
    at sun.security.ssl.Handshaker.process_record(Handshaker.java:914) 
    at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1062) 
    at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1375) 
    at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1403) 
    at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1387) 
    at jodd.http.net.SocketHttpConnectionProvider.createSSLSocket(SocketHttpConnectionProvider.java:153) 
    at jodd.http.net.SocketHttpConnectionProvider.createHttpConnection(SocketHttpConnectionProvider.java:68) 
    at jodd.http.HttpRequest.open(HttpRequest.java:665) 
    ... 4 more 
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:387) 
    at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:292) 
    at sun.security.validator.Validator.validate(Validator.java:260) 
    at sun.security.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:324) 
    at sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java:229) 
    at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:124) 
    at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1491) 
    ... 14 more 
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target 
    at sun.security.provider.certpath.SunCertPathBuilder.build(SunCertPathBuilder.java:141) 
    at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:126) 
    at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:280) 
    at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:382) 
    ... 20 more 
---[cause]------------------------------------------------------------------------ 
sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target 
    at sun.security.provider.certpath.SunCertPathBuilder.build(SunCertPathBuilder.java:141) 
    at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:126) 
    at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:280) 
    at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:382) 
    at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:292) 
    at sun.security.validator.Validator.validate(Validator.java:260) 
    at sun.security.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:324) 
    at sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java:229) 
    at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:124) 
    at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1491) 
    at sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:216) 
    at sun.security.ssl.Handshaker.processLoop(Handshaker.java:979) 
    at sun.security.ssl.Handshaker.process_record(Handshaker.java:914) 
    at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1062) 
    at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1375) 
    at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1403) 
    at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1387) 
    at jodd.http.net.SocketHttpConnectionProvider.createSSLSocket(SocketHttpConnectionProvider.java:153) 
    at jodd.http.net.SocketHttpConnectionProvider.createHttpConnection(SocketHttpConnectionProvider.java:68) 
    at jodd.http.HttpRequest.open(HttpRequest.java:665) 
    at jodd.http.HttpRequest.open(HttpRequest.java:649) 
    at jodd.http.HttpRequest._send(HttpRequest.java:747) 
    at jodd.http.HttpRequest.send(HttpRequest.java:742) 
    at jodd.JoddHttpTest.main(JoddHttpTest.java:56) 
+0

發佈完整的堆棧跟蹤。在你的問題。 – EJP

+0

根據堆棧跟蹤,你正在調用'startHandshake()'。這是真實的代碼嗎? – EJP

+0

@EJP是的,爲什麼?我在多個例子中看到了這一點,也是如此。它的工作?你能否詳細說明一下? – igr

回答

1

這裏就是答案。從我的經驗來看,這個:

sslSocket = (SSLSocket) socketFactory.createSocket(); 
sslSocket.connect(new InetSocketAddress(host, port), connectionTimeout); 

不起作用(儘管你可以在任何地方看到這個解決方案!)。相反,我做了以下內容:創建一個普通插座,然後把它包裝成SSL插座:

Socket sock = new Socket(); 
sock.connect(new InetSocketAddress(host, port), connectionTimeout); 
sslSocket = (SSLSocket)socketFactory.createSocket(sock, host, port, true); 

其中socketFactorySSLSocketFactory實例。