5

我的应用程序连接到 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信任我拥有的证书的签名机构?此外,如何从我拥有的证书中提取有关证书签名者的信息?

谢谢,丹。

4

1 回答 1

3

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

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

然后假设 .ks 文件是 jks 密钥库,使用 keytool 将证书导入密钥库。

更新:忽略我所说的关于中间证书的内容,你不应该需要它(请参阅Truststore 需要 sub-ca 证书吗?)。只需导入根 ca 证书。

于 2014-10-29T11:39:46.553 回答