1

我的 Java 程序使用 GitHub 的原始地址来访问版本文件以获取最新版本。此地址的格式为https://raw.github.com/user/repository/branch/version_file

在测试阶段,我使用以下代码没有问题:

currentVersion = new Version(plugin.getDescription().getVersion());

URL url = new URL("https://raw.github.com/zonedabone/CommandSigns/master/VERSION");
URLConnection connection = url.openConnection();
BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
newestVersion = new Version(in.readLine());

if (currentVersion.compareTo(newestVersion) < 0)
    newAvailable = true;

但是,一些用户抱怨以下错误:

sun.security.validator.ValidatorException:
  PKIX path building failed:
    sun.security.provider.certpath.SunCertPathBuilderException:
      unable to find valid certification path to requested target

Java 抱怨它无法验证 SSL 证书。GitHub 的证书由 DigiCert 验证,但显然一些 Java 版本无法识别这一点。

我读过有两种方法可以克服这个问题:将证书添加到 TrustStore 并完全禁用验证。

StackOverflow 上建议的答案要么使用允许所有的 TrustStore,考虑到它不在“测试环境”的范围内,这将是一个非常糟糕的主意,或者如果它们显示如何添加证书,它们通常链接到一个损坏的网页。

有人可以提供新信息吗?

4

2 回答 2

4

首先是理论......正如JSSE 参考指南所说:

重要说明:JDK 在 /lib/security/cacerts 文件中附带了数量有限的受信任根证书。如 keytool 中所述,如果您将此文件用作信任库,则您有责任维护(即添加/删除)此文件中包含的证书。

根据您联系的服务器的证书配置,您可能需要添加额外的根证书。从适当的供应商处获取所需的特定根证书。

用户应自行维护 CA 证书列表。不幸的是,许多人不知道该怎么做。他们可以cacerts在自己的安装中使用另一个 JRE 的文件(更新的)。

您可以使用信任任何证书的信任管理器并将其专门用于该连接,但这不是一个好主意,因为它会打开潜在 MITM 攻击的连接。对于这种不安全的解决方案,有足够多的代码示例。

如果您想信任特定证书,最好的解决方案是使用特定的信任库正确加载它,如本答案中所述。InputStream如果您想将它与您的应用程序捆绑在一起,您甚至可以从类加载器中加载此信任库。

或者,在可能的情况下,您可以直接使用操作系统信任库。在 Windows 上,您可以按照本文Windows-ROOT所述加载密钥库。在 OSX 上,您可以加载.KeychainStore

于 2012-09-13T17:27:47.887 回答
-2

您可以使用“all”-TrustManager 实现 HttpsUrlConnection

http://bitsandcodes.blogspot.de/2010/08/create-trust-manager-that-trust-all-ssl.html

于 2012-09-13T15:48:25.363 回答