2014-10-29 113 views
4

我的應用程序連接到使用證書驗證其身份的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

回答

2

假設發佈的代碼在證書更改前工作,請保持原樣。請修改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

相關問題