6

多年来,我一直在构建 Web 下载器(例如,使用 Apache HTTPClient 和最近的 JBrowser [1])。直到最近,当某些网站导致认证错误时,这些都可以正常工作。我不了解细节,也找不到简单的教程供那些对证书知之甚少的人(例如,证书的外观以及如何获得或创建)。这是对最简单情况以及如何修复它的默认解释的请求。典型错误:

[2020-02-17T09:38:24.249][Instance 1][Port 57129] Warning: Single GUI Threadiong is enabled, FPS should be slower
[2020-02-17T09:38:29.737][Instance 1][Port 57129] Feb 17, 2020 9:38:29 AM com.sun.webkit.network.URLLoader doRun
[2020-02-17T09:38:29.737][Instance 1][Port 57129] WARNING: Unexpected error
[2020-02-17T09:38:29.737][Instance 1][Port 57129] java.io.IOException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target: https://osf.io/search/?q=coronavirus
[2020-02-17T09:38:29.737][Instance 1][Port 57129]   at com.machinepublishers.jbrowserdriver.StreamConnection.exec(StreamConnection.java:369)
[2020-02-17T09:38:29.737][Instance 1][Port 57129]   at com.machinepublishers.jbrowserdriver.StreamConnection.getResponseCode(StreamConnection.java:449)
[2020-02-17T09:38:29.737][Instance 1][Port 57129]   at com.sun.webkit.network.URLLoader.receiveResponse(URLLoader.java:414)
...

我可以通过浏览器(Firefox、Chrome)访问 URL 并获取代表我想要的 HTML,但无法以编程方式访问它。

我已经阅读了几个关于如何解决此问题的说明(例如 [2]),但它们通常指的是“您的密钥库”或“信任管理器”,就好像每个人都知道它们是什么一样。我担心如果我不知道自己在做什么,我可能会破坏安全性。我不知道如何将站点添加到这些站点,或者是否应该添加站点。

我在 MACOSX 上,似乎有一个二进制文件

"/Library/Java/JavaVirtualMachines/jdk1.8.0_60.jdk/Contents/Home/JRE/lib/security/cacerts"

一些答案表明我应该有一个名为“truststore.jks”的文件,但没有说明它应该在哪里或它是如何创建的。

所以我要求对系统组件进行简单的解释以及修复它的最简单方法。在某些情况下,我可以避免它(例如,通过curl从命令行使用),所以我不知道这在多大程度上是一个 Java (8) 问题。

编辑: Trust Store vs Key Store - 使用 keytool 创建似乎可以解释 KeyStore 和 TrustStore 之间的区别,但我仍然不知道该怎么做。

[1] http://machinepublishers.github.io/jBrowserDriver/com/machinepublishers/jbrowserdriver /JBrowserDriver.html [2]在 java 中使用自定义信任库以及默认信任库

4

1 回答 1

3

抱歉,我不确定你需要多少细节。希望它能让你开始。我可以根据您的需要扩展步骤。让我知道。

Keystore 存储私钥和公​​共证书,而 truststore 存储您想要信任的其他服务的可信证书。Java 捆绑了 truststore cacerts,它包含默认的、众所周知的可信证书颁发机构。

作为 ssl 握手的一部分,服务将其公共证书从其密钥库提供给客户端,另一方面,客户端根据其信任库验证提供的证书。

对于任何编程访问,我将创建一个单独的信任库文件并导入您信任的服务的证书。因此,在您的情况下,您必须导入https://osf.io/search/?q=coronavirus提供的证书。

创建信任库后,您可以使用 jvm args 引用信任库。

脚步

  1. 使用 KeyTool 创建空的信任库
  2. 使用 InstallCert 实用程序或从浏览器将证书导入信任库
  3. 在 jvm arg (javax.net.ssl.truststore) 中引用新创建的信任库
于 2020-02-20T20:09:02.680 回答