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

Java 使用未经验证的SSL证书通过HTTPS下载文件,java,ssl,Java,Ssl,我的Java程序使用GitHub的原始地址访问版本文件以获取最新版本。此地址的格式为 在测试阶段,我在使用以下代码时没有遇到任何问题: currentVersion = new Version(plugin.getDescription().getVersion()); URL url = new URL("https://raw.github.com/zonedabone/CommandSigns/master/VERSION"); URLConnection connection = ur

我的Java程序使用GitHub的原始地址访问版本文件以获取最新版本。此地址的格式为

在测试阶段,我在使用以下代码时没有遇到任何问题:

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;
Java抱怨它无法验证SSL证书。GitHub的证书由DigiCert验证,但显然有些Java版本无法识别这一点

我已经读到有两种方法可以克服这个问题:将证书添加到信任库和完全禁用验证

StackOverflow上建议的答案要么使用allow all TrustStore,考虑到它不在“测试环境”的范围内,这将是一个非常糟糕的主意,要么如果他们展示了如何添加证书,他们通常会链接到一个损坏的网页


有人能提供新信息吗?

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


就像第一个理论。。。正如政府所说:

重要提示:JDK附带的受信任根目录数量有限 /lib/security/cacerts文件中的证书。作为 记录在keytool中,您有责任维护(即, 添加/删除)此文件中包含的证书(如果使用此 文件作为信任库

根据您联系的服务器的证书配置, 您可能需要添加其他根证书。获得所需的 来自适当供应商的特定根证书

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

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

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


或者,在可能的情况下,您可以直接使用OS信任存储。在Windows上,您可以加载
Windows根目录
密钥库,如中所述。在OSX上,您可以加载
KeychainStore

有更好的示例吗?这一个使用了不推荐使用的类型,如SSLContext,并使用了在我的IDE中无法解析的JSSESocketFactory。编辑:这些类型没有被推荐使用,我只是进行了错误的导入。但是,我仍然不能使用JSSESocketFactory,因为我没有使用org.apache。这
JSSESocketFactory
是特定于Axis的,这与问题无关。此外,盲目信任所有证书也是一个坏主意。这个问题在SO和web上已经被问过无数次了。请在“java自签名证书”上进行谷歌搜索并删除此问题。可能重复@JimGarrison,对,不幸的是,谷歌搜索将导致大量答案,建议使用信任任何证书的信任管理器。@Bruno同意,我已对您的答案进行了投票。@JimGarrison可能不是重复的。这个问题实际上不是问一个自签名证书,而是一个由DigiCert签名的证书;根据“keytool-list”,Java的cacerts文件中有“DigiCert高保证EV根CA”(带有指纹5f b7 ee 06…)。因此,它应该已经起作用了,而目前的答案并不能解释其他一些问题。您提出的第一个解决方案似乎很合理。我现在要离开一个星期,所以在我接受它之前,我必须让其他插件开发人员看看这个。第二个答案是不可能的,因为插件不依赖于操作系统。
sun.security.validator.ValidatorException:
  PKIX path building failed:
    sun.security.provider.certpath.SunCertPathBuilderException:
      unable to find valid certification path to requested target