多年来,我一直在构建 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]),但它们通常指的是“您的 keystore ”或“信任管理器”,就好像每个人都知道它们是什么一样。我担心如果我不知道自己在做什么,我可能会破坏安全性。我不知道如何将站点添加到这些站点,或者是否应该添加站点。
我在 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 - creating with keytool似乎解释了 KeyStore 和 TrustStore 之间的区别,但我仍然不知道该怎么做。
[1] http://machinepublishers.github.io/jBrowserDriver/com/machinepublishers/jbrowserdriver
/JBrowserDriver.html
[2] Using a custom truststore in java as well as the default one
最佳答案
抱歉,我不确定你需要多少细节。希望它能让你开始。我可以根据您的需要扩展步骤。让我知道。
Keystore 存储私钥和公共证书,而 truststore 存储您想要信任的其他服务的可信证书。Java 捆绑了 truststore cacerts,它包含默认的、众所周知的可信证书颁发机构。
作为 ssl 握手的一部分,服务将其公共(public)证书从其 keystore 提供给客户端,另一方面,客户端根据其信任库验证提供的证书。
对于任何编程访问,我将创建一个单独的信任库文件并导入您信任的服务的证书。因此,在您的情况下,您必须导入 https://osf.io/search/?q=coronavirus 提供的证书.
创建信任库后,您可以使用 jvm args 引用信任库。
脚步
关于java - 客户端 (X509) 认证的默认环境应该是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60259973/