使用未经验证的SSL证书通过HTTPS下载文件

时间:2012-09-13 15:43:12

标签: java ssl

我的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,考虑到它不在测试环境的范围内,或者如果他们显示,这将是一个非常糟糕的主意。如何添加证书,他们通常链接到破碎的网页。

有人可以提供新信息吗?

2 个答案:

答案 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