2014-12-19 159 views
0

我使用Java密鑰,通過API看,但我想不出爲什麼密鑰庫:爲什麼getCertificateChain(..)不需要密碼,而getKey需要密碼?

Certificate[] chain = ks.getCertificateChain(alias) 

不需要密碼來獲取證書鏈,而

PrivateKey pk = (PrivateKey) ks.getKey(alias, PASSWORD); 

需要密碼?

我讀過這個,但沒有看到什麼證書不需要密碼。我的特殊證書具有公鑰和私鑰。我可以理解爲什麼具有公鑰的證書不需要密碼。我不明白爲什麼每當我訪問密鑰庫時,我都不需要輸入密碼作爲參數。

http://docs.oracle.com/javase/7/docs/api/java/security/cert/Certificate.html

回答

2

淺表:你需要一個密碼,因爲專用密鑰值與密碼進行加密,以保持私營得到一個專用密鑰值,因爲專用密鑰應該是私有的。您不需要密碼來解密證書,即使是在私鑰條目中的證書也是如此,因爲證書沒有加密,因爲不需要它是私密的。啊,你說,但爲什麼不需要證書是私人的?

基本信息:公鑰加密技術的定義特徵和主要特點是publickey始終可以並且通常是公共的,系統(如果正確實現和使用的話)仍然是安全的。由於公鑰的證書的主要目的是真實但不是保密傳達的公鑰,它幾乎總是也被視爲公共,雖然實際上證書有時包含其他信息可能有點敏感。

例如,當Web瀏覽器等HTTPS客戶端連接到網站時,服務器必須提供其證書以及通常(大部分)其證書鏈,以便客戶端可以將服務器認證爲有效並保護密鑰交換。任何人都可以看到網絡上的流量(包括合法的東西,如路徑中的路由器),並且即使實際的Web請求或事務不被允許,大多數服務器也可以通過或多或少的任何潛在客戶端來獲得這些證書。如果您希望人們發送加密的S/MIME電子郵件給您,您需要向他們發送您的證書或在任何發件人可以訪問的地方發佈證書,以便可以確保使用正確的加密密鑰您。當您發送已簽名的S/MIME電子郵件時,您需要包含或發佈您的證書,以便收件人可以驗證您的電子郵件 - 除非收件人已經擁有它們,在這種情況下,它們是先前發送或發佈的。這些流程通常允許除了實際希望的或需要的發送者和接收者以外的許多人,雖然並非總是確切地每個人都看到你的證書。如果您想簽署代碼,您必須同樣提供或提供您的證書以供收件人用來驗證簽名;尤其是對於簽署小程序(Java的設計案例),這通常會讓您的證書在世界的很大一部分可見。

證書不應該包含私鑰。 X.509定義的格式不適用於它,並且適當的CA既不被允許也不能包含它。如果您運行自己的非標準CA並定義自己的非標準擴展名,這些擴展名違反了已久的共識實踐以使自己不安全,恭喜,您已經成功了。

什麼通常必須,並應具有是一個專用密鑰條目含有專用密鑰值這是私人/加密和一個或多個證書形成鏈,其中第一(或唯一的)證書包含公鑰那匹配(並且在生成期間實際上是從)私鑰。這就是java.security.KeyStore如何定義PrivatKeyEntry。您可以獲取證書鏈或第一個證書,而無需密碼。您需要輸入密碼才能從私鑰輸入訪問值爲的值

文件密碼:以上所有內容均針對內存中的KeyStore。如果你寫一個密鑰存儲到一個文件(默認提供至少)是完整性通過哈希由文件鍵入密碼保護(稱爲keytool密碼),你必須提供;在讀取文件時,是否可以選擇是否提供此密碼以驗證完整性。