2017-02-23 70 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