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

问题描述:

我的应用程序连接到使用证书验证其身份的SSL Web服务。最近,这个证书发生了变化,并且由于它没有被可信任的权威机构签名,所以我的部分应用程序失败该服务的建议,以防止在将来的这种情况下,我应该开始信任现有的证书的签名权威,而不是个人证书。如何信任Java中的证书颁发机构?

在Java中如何实现?

目前我使用密钥工具,并撰写成的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其信任签署我所拥有的证书的权力?另外,如何从证书中提取有关证书签名者的信息?

谢谢,丹。

+0

请参阅http://javarevisited.blogspot.de/2012/09/difference-between-truststore-vs-keyStore-Java-SSL.html - 您信任您的信任库中包含的任何证书。 – zapl 2014-10-29 11:51:45

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

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

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

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

+0

谢谢。我现在看到它应该如何工作。不幸的是,凭借我通过浏览器访问Web服务所获得的证书,证书层次结构中只有它。所以我应该回到他们身边并要求他们提供CA的证书或根/中介?只是澄清我应该使用的术语。谢谢! – Dan 2014-10-29 11:55:01

+1

听起来像是证书不是由CA生成的,或者它们的Web服务器配置不正确。您可能需要向Web服务管理员提出此建议。 – poida 2014-10-29 12:01:03