Java 用BouncyCastle阅读JKS

Java 用BouncyCastle阅读JKS,java,bouncycastle,keystore,Java,Bouncycastle,Keystore,我有一个Java密钥库(JKS),我需要用BouncyCastle阅读它 我在提供者列表的顶部添加了BC提供者: Security.insertProviderAt(new BouncyCastleProvider(), 1); 如果我这样创建密钥库: final KeyStore keystore = KeyStore.getInstance("JKS", "BC"); 我得到一个错误: java.security.KeyStoreException:未找到JKS 如果我没有指定提供程序,

我有一个Java密钥库(JKS),我需要用BouncyCastle阅读它

我在提供者列表的顶部添加了
BC
提供者:

Security.insertProviderAt(new BouncyCastleProvider(), 1);
如果我这样创建密钥库:

final KeyStore keystore = KeyStore.getInstance("JKS", "BC");
我得到一个错误:

java.security.KeyStoreException:未找到JKS

如果我没有指定提供程序,则将使用
Sun
提供程序创建密钥库,并且
KeyStore.alias()
将包含
EmptyEnumeration

正如我在主题中看到的,BouncyCastle可以与JKS一起工作

如何使用BouncyCastle阅读JKS?

使用BKS代替JKS

 KeyStore keystore = KeyStore.getInstance("BKS", "BC");
请参见第6.4节-密钥库

Bouncy Castle包有三个密钥库实现。 第一个“BKS”是一个密钥库,它将以与Sun“JKS”密钥库相同的方式使用keytool

结果将与Sun提供程序相同。如果您得到一个空列表,请检查JKS是否为空,并且您正在正确读取它

使用BKS而不是JKS

 KeyStore keystore = KeyStore.getInstance("BKS", "BC");
请参见第6.4节-密钥库

Bouncy Castle包有三个密钥库实现。 第一个“BKS”是一个密钥库,它将以与Sun“JKS”密钥库相同的方式使用keytool


结果将与Sun提供程序相同。如果您得到一个空列表,请检查JKS是否为空并且您正在正确阅读它

是否在程序顶部添加了以下行:
Security.addProvider(new BouncyCastleProvider())?请参阅.@Mr.Polywhill Yes。我已经编辑了描述,您混淆了“使用”和“实施”。通常不应在JCE的任何
getInstance()
方法中指定提供程序。只需使用
Security.addProvider()
添加提供程序,然后让JCE从任何提供程序中查找实现。只有Oracle提供程序实现JKS密钥库,但是您的
keystore.getInstance(“JKS”,“BC”)强制JCE只查看BouncyCastle中没有的JKS实现。另外,除非您确实知道自己在做什么,否则不要在特定位置添加BouncyCastle提供程序。您是否在程序顶部添加了以下行:
Security.addProvider(新的BouncyCastleProvider())?请参阅.@Mr.Polywhill Yes。我已经编辑了描述,您混淆了“使用”和“实施”。通常不应在JCE的任何
getInstance()
方法中指定提供程序。只需使用
Security.addProvider()
添加提供程序,然后让JCE从任何提供程序中查找实现。只有Oracle提供程序实现JKS密钥库,但是您的
keystore.getInstance(“JKS”,“BC”)强制JCE只查看BouncyCastle中没有的JKS实现。另外,除非您真的知道自己在做什么,否则不要在特定位置添加BouncyCastle提供程序。我已经尝试过了,在本例中,
keystore.aliases()
返回
EmptyEnumeration
您的keystore是否有证书?使用
keytool-list-v-keystore keystore.jks检查您是否以这种方式读取密钥库?:
keystore.load(inputStream,password)是我可以使用具有相同参数的keytool查看此证书请检查
InputStream
是否提供给
keystore.load(InputStream,password)不为空。如果inputstream为Null,则此方法将重置密钥库。我的密钥库路径错误。getInstance(“JKS”)可以工作。谢谢,我已经尝试过了,在本例中,
keystore.aliases()
返回
EmptyEnumeration
您的密钥库是否有证书?使用
keytool-list-v-keystore keystore.jks检查您是否以这种方式读取密钥库?:
keystore.load(inputStream,password)是我可以使用具有相同参数的keytool查看此证书请检查
InputStream
是否提供给
keystore.load(InputStream,password)不为空。如果inputstream为Null,则此方法将重置密钥库。我的密钥库路径错误。getInstance(“JKS”)可以工作。非常感谢。