2016-11-29 91 views
0

我有一個Java KeyStore(JKS),我需要閱讀它與BouncyCastle。閱讀JKS與BouncyCastle

我添加BC供應商在供應商列表的頂部:

Security.insertProviderAt(new BouncyCastleProvider(), 1); 

如果我創建密鑰庫是這樣的:

final KeyStore keystore = KeyStore.getInstance("JKS", "BC"); 

我得到一個錯誤:

java.security.KeyStoreException: JKS not found

如果我沒有指定供應商,將使用Sun供應商創建KeyStore,並且keystore.aliases()將包含EmptyEnumeration

正如我在this話題看到,BouncyCastle的可JKS

工作,我怎樣才能讀取BouncyCastle的JKS?

+1

你是否在程序的頂部添加了以下行:'Security.addProvider(new BouncyCastleProvider());'?參考[6.0節](https://www.bouncycastle.org/specifications.html)。 –

+0

@ Mr.Polywhirl是的。我編輯了說明 – Kirill

+1

您很困惑「使用」和「實施」。您通常不應該在JCE的任何'getInstance()'方法中指定提供者。只需使用'Security.addProvider()'添加提供程序,讓JCE找到任何提供程序的實現。只有Oracle提供者實現了JKS密鑰庫,但是你的'KeyStore.getInstance(「JKS」,「BC」);'強制JCE只查看BouncyCastle的JKS實現,它沒有。另外,除非你真的知道你在做什麼,否則不要在特定位置添加BouncyCastle提供程序。 –

回答

2

使用BKS而不是JKS

KeyStore keystore = KeyStore.getInstance("BKS", "BC"); 

見節https://www.bouncycastle.org/specifications.html

The Bouncy Castle package has three implementation of a keystore. The first "BKS" is a keystore that will work with the keytool in the same fashion as the Sun "JKS" keystore.

結果6.4密鑰庫將是一樣的Sun提供者。如果你得到一個空的列表,檢查JKS不是空的,你正在正確地閱讀它

+0

我試過這個,在這種情況下'keystore.aliases()'返回'EmptyEnumeration' – Kirill

+1

您的密鑰庫是否有證書?使用'keytool -list -v -keystore keystore.jks'檢查你是否以這種方式讀取密鑰倉庫?:'keystore.load(inputStream,password);' – pedrofb

+0

是的,我可以使用keytool以相同的參數看到此證書 – Kirill