2017-02-23 114 views
0

我想可以使用HtmlUnit,登錄到使用HTTPS連接的網站,我得到一個錯誤的語句無法使用使用的HtmlUnit網站連接HTTPS

page = webClient.getPage(url); 

唯一的例外是

引起
error: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` 

我迄今所做的:

  • 導出個人證書的網站」使用的證書鏈Firefox和使用Java keytool它們導入了JVM的默認密鑰庫,例如:

    keytool -import -trustcacerts -alias root -file C:\Users\myUser\Desktop\Certificates\VeriSignClass3PublicPrimaryCertificationAuthority-G5.crt -keystore C:\Program Files (x86)\Java\jre1.8.0_91\lib\security\cacerts 
    
  • 使用Java keytool開始了新的密鑰庫,並僅進口相關的根,中間和特定網站證書。

  • 設置使用

    System.setProperty("javax.net.ssl.trustStore", "C:/Users/Henry/workspace/AutoEtime/cacerts"); 
    
  • 試圖改變瀏覽器版本Chrome瀏覽器,然後到Firefox
  • 儘量選用SSLPoke.class從confluence.atlassian.com測試如果此證書作爲Java證書存儲證書是正確的,但我不知道要連接的端口,並使用默認的433給出一個​​

我還沒有嘗試過使用任何其他方法大綱d在WebClientOptions文檔中發現here,因爲我不知道如何使用它們來獲得我想要的效果。

一,我在網上看到的最常見的答案是使用webClient.setUseInsecureSSL(true);

這測試我的應用程序正常工作的建議,但是我需要有連接使用SSL由於靈敏度的固定用戶名和密碼,我用來連接到網站。

我想補充的一件有趣的事情是,實際上每5-10次嘗試中就有一次嘗試,並且不會拋出SSLHandshakeException,即使我沒有在代碼中進行任何更改。

我該如何解決這個問題?另外,它爲什麼每隔一段時間就會工作?

+0

HTTPS的默認端口是443而不是433.在Windows下手動更改/寫入文件在'\ Program Files'或'\ Program Files(x86)'上是一個壞主意;對於新版Windows版本,這些更改可能不起作用,或者有時可能會起作用,這可能會解釋您的間歇性行爲。要麼在別處安裝Java(我喜歡'c:\ Java')或者使用第二個項目符號:創建您自己的密鑰存儲並指向它;如果服務器行爲正確,則只需要root證書即可,並且確保在JVM進程中首次使用SSL之前設置'trustStore'(AND'trustStorePassword',如果不是'changeit')。 –

+0

是否有可能提供您嘗試使用的主機名? –

+0

你是對的Dave,我在運行SSLPoke.class時在我的問題和參數中輸入了錯誤的端口。只要我改變它並添加證書,它就成功連接了。 –

回答

1

好吧,所以我想通過嘗試不同的事情。事實證明,我需要以.der形式而不是.crt導入證書。默認密鑰庫已經有了正確的根證書,但缺少的是中間證書和葉證書的組合。在我導入了intermediate.der和leaf.der並指定了我的cacerts文件的副本之後,SSLHandshakeException還沒有再次發生。希望這實際上已經解決了這個問題,並且這個例外沒有問題。

+0

亨利馬哈我不明白你的答案。什麼是der?你是怎麼找到它們的?我們有類似的問題。 – user1567291