我的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,考虑到它不在测试环境的范围内,或者如果他们显示,这将是一个非常糟糕的主意。如何添加证书,他们通常链接到破碎的网页。
有人可以提供新信息吗?
答案 0 :(得分:4)
首先是理论......正如JSSE Reference Guide所说:
重要说明:JDK附带有限数量的受信任root / lib / security / cacerts文件中的证书。如 在keytool中记录,您有责任维护(即, 如果使用此文件,请添加/删除此文件中包含的证书 将文件作为信任库。
根据您联系的服务器的证书配置, 您可能需要添加其他根证书。获得所需 来自相应供应商的特定根证书。
用户应自行维护CA证书列表。不幸的是,许多人不知道如何做到这一点。他们可以在自己的安装中使用另一个JRE的cacerts
文件(更新)。
您可以使用信任任何证书的信任管理器并专门用于该连接,但这不是一个好主意,因为它打开了与潜在MITM攻击的连接。这个不安全的解决方案有足够的代码示例。
如果您想要信任特定证书,最佳解决方案是使用特定信任库正确加载它,如this answer中所述。如果要将其与应用程序捆绑在一起,您甚至可以从类加载器的InputStream
加载此信任库。
或者,如果可能,您可以直接使用OS信任存储。在Windows上,您可以按this article中所述加载Windows-ROOT
密钥库。在OSX上,您可以加载KeychainStore
。
答案 1 :(得分:-2)
您可以使用“all”-TrustManager
实现HttpsUrlConnection喜欢http://bitsandcodes.blogspot.de/2010/08/create-trust-manager-that-trust-all-ssl.html