java - 客户端 (X509) 认证的默认环境应该是什么

标签 java macos x509certificate pkix

多年来,我一直在构建 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 引用信任库。

脚步

  • 使用 KeyTool 创建空信任库
  • 使用 InstallCert 实用程序或从浏览器将证书导入信任库
  • 在 jvm arg (javax.net.ssl.truststore)
  • 中引用新创建的信任库

    关于java - 客户端 (X509) 认证的默认环境应该是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60259973/

    相关文章:

    macos -/usr/bin/ssh-copy-id: line 1: ucgi::command not found

    python - 无法在 Mac OS 中安装 gensim

    security - 免费 SSL 返回的证书

    Openssl x509v3 扩展 key 用法

    c# - Azure IoT 中心对其他设备的未经授权访问

    java:从文件读取时循环产生不正确的输出?

    java - 如何在页面加载时第一次在JSP上显示下拉列表的第一个值?

    java - 用于隐藏 Java Web 服务的身份验证详细信息的外观

    Java Swing JLabel 文本长于界限

    linux - 使用 -c 和 awk 的管道字符串调用 bash 命令