繁体   English   中英

无法使用Htmlunit通过HTTPS连接到网站

[英]Unable to connect using Htmlunit to website using 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密钥工具启动了一个新的密钥库,并且仅导入了相关的根目录,中间目录和特定网站的证书。

  • 使用以下命令将此证书设置为Java证书存储

      System.setProperty("javax.net.ssl.trustStore", "C:/Users/Henry/workspace/AutoEtime/cacerts"); 
  • 尝试将浏览器版本更改为Chrome,然后更改为Firefox
  • 试图使用confluence.atlassian.com的SSLPoke.class测试证书是否正确,但是我不知道要连接的端口,并且使用默认的433给出了ConnectException: Connection timed out

我没有尝试使用此处找到的WebClientOptions文档中概述的任何其他方法,因为我不确定如何使用它们来获得想要的效果。

我在网上看到的最常见的答案之一是建议使用webClient.setUseInsecureSSL(true);

这对于测试我的应用程序效果很好,但是由于我用于连接到网站的用户名和密码的敏感性,因此我需要使用SSL保护连接的安全。

我想添加的一件有趣的事情是, 每5-10次尝试中就有1次实际上有效 ,并且即使我在代码中未进行任何更改,也不会引发SSLHandshakeException。

我该如何解决这个问题? 此外,为什么它有时偶尔工作?

好的,所以我通过尝试不同的方法来弄清楚了。 原来,我需要以.der格式而不是.crt格式导入证书。 默认密钥库已经具有正确的根证书,但是缺少的是中间证书和叶证书的某种组合。 在我导入了intermediate.der和leaf.der并指定了我的cacerts文件副本所在的位置之后,SSLHandshakeException不再发生。 希望这实际上已经解决了它,并且该异常已经消失了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM