【问题标题】:How to trust a certificate authority in Java?如何信任 Java 中的证书颁发机构?
【发布时间】:2014-12-25 02:09:13
【问题描述】:

我的应用程序连接到 SSL Web 服务,该服务使用证书来验证其身份。最近,这个证书发生了变化,因为它不是由受信任的机构签名的,所以我的部分应用程序失败了。该服务对未来防止这种情况的建议是,我应该开始信任现有证书的签名机构,而不是单个证书。

如何在 Java 中实现这一点?

目前我正在使用 keytool 将他们提供的证书添加到密钥库中,并将其组合到 TrustManagerFactory 中,例如:

public static TrustManager[] getTrustManagers() throws KeyStoreException, NoSuchAlgorithmException, CertificateException, IOException {
    KeyStore tks = KeyStore.getInstance(KeyStore.getDefaultType());
    tks.load(StarTrustManagerFactory.class.getResourceAsStream("webservice.ks"), "password".toCharArray());
    TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
    tmf.init(tks);
    return tmf.getTrustManagers();
}; 

有没有办法调整这种方法来返回一个信任我所拥有证书的签名机构的TrustManager?另外,如何从我拥有的证书中提取有关证书签名者的信息?

谢谢,丹。

【问题讨论】:

标签: java ssl certificate certificate-authority


【解决方案1】:

假设在证书更改之前发布的代码有效,请保持原样。而是修改 webservice.ks 密钥库并导入您要连接到的站点的 intermediate 和 根 ca 证书。

您可以通过在网络浏览器中访问该地址并将其保存到磁盘来获取这些证书。有关如何在 Firefox 中执行此操作,请参阅 https://superuser.com/a/97203/172370。但是,在链接说明的第 4 步中,选择要导出的根/intermediate ca 证书(单击所需的证书层次结构框)。

那么假设 .ks 文件是一个 jks 密钥库,使用 keytool 将证书导入到密钥库中。

更新:忽略我所说的关于中间证书的内容,你不应该需要它(参见Does a truststore need the sub-ca certificate?)。只需导入根 ca 证书即可。

【讨论】:

  • 谢谢。我现在明白它应该如何工作了。不幸的是,对于我通过浏览器访问 Web 服务获得的证书,它在其证书层次结构中是唯一的。所以我应该回到他们那里,向他们索要 CA 的证书或根/中介?只是澄清我应该使用的术语。谢谢!
  • 听起来证书不是由 CA 生成的,或者他们的 Web 服务器配置不正确。您可能需要向网络服务管理员提出此问题。
猜你喜欢
  • 2014-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-11
  • 2014-12-26
相关资源
最近更新 更多