2011-02-07 127 views
7

我對java密鑰庫和keytool有以下問題。我假設密鑰庫可能有多個證書。正如我已經試過,通過keytool我可以創建一個密鑰庫,並且要訪問這個密鑰庫,我必須設置一個密碼。同樣要訪問每個證書條目,我必須設置密碼。是否必須爲密鑰庫和條目使用相同的密碼?如果沒有(我認爲這是合理的假設)爲什麼是以下代碼:java密鑰庫和密碼設置

char[] pwd = new char[]{'s','e','c','r','e','t'}; 
KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType()); 
ks.load(new FileInputStream("myPersonal.keystore"), pwd); 
kmf.init(ks, pwd);//fails here with exception 

給我以下例外?

Exception in thread "main" java.security.UnrecoverableKeyException: Cannot recover key 
    at sun.security.provider.KeyProtector.recover(Unknown Source) 
    at sun.security.provider.JavaKeyStore.engineGetKey(Unknown Source) 
    at sun.security.provider.JavaKeyStore$JKS.engineGetKey(Unknown Source) 
    at java.security.KeyStore.getKey(Unknown Source) 

secret是訪問我通過密鑰工具創建密鑰庫myPersonal.keystore的密碼。其中有2個條目,用於證書,1個DSA和1個RSA。每個密鑰都與密鑰庫(以及相互之間)有不同的密碼。現在代碼是正確的,因爲如果我使用一個具有與密鑰庫相同密碼的證書條目的密鑰庫,則沒有例外,程序運行良好。

那麼這裏有什麼問題?我不應該有不同的密碼?我不應該有很多證書?或者是什麼?

回答

7

按照API的規定,KeyManagerFactory.init方法接受用於從密鑰庫檢索密鑰的密​​碼。由於只有一個密碼參數,因此期望所有密鑰的密碼都相同。如果其中一個密鑰使用了不同的密碼,那麼您將看到您看到的錯誤,因爲該特定密鑰庫條目的密碼不正確。

最簡單的解決方案是爲密鑰庫中的所有條目使用相同的密碼。如果您爲每個條目設置不同的密碼,那麼您可能需要考慮構建自己的自定義安全元素,例如KeyManager。

+0

所以你說這是一個隱含的需求?是否有任何理由在KeyManagerFactory中強制實施此限制?我假設在真實場景中常見的情況是使用不同的密碼 – Cratylus 2011-02-08 08:06:43