如何信任Java中的证书颁发机构?

时间:2014-10-29 11:30:03

标签: java ssl certificate certificate-authority

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

谢谢,Dan。

1 个答案:

答案 0 :(得分:2)

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

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

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

更新:忽略我对中间证书所说的话,你不应该需要它(见Does a truststore need the sub-ca certificate?)。只需导入root ca证书。