多年来,我一直在构建 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 中使用自定义信任库以及默认信任库