将pfx格式的Java转换为可导入默认密钥库的格式

4
我正在使用以下代码将证书以编程方式加载到默认密钥库中:

我正在使用以下代码将证书以编程方式加载到默认密钥库中:

KeyStore kStore = KeyStore.getInstance(KeyStore.getDefaultType());
java.io.FileInputStream fis = new FileInputStream(keystorePath);
kStore.load(fis, new String(keystorePass).toCharArray());
fis.close();

我有一份以pfx格式提供的来自第三方的证书。如果我尝试加载它,会提示格式无效。
如果我更新并使用以下代码,则能够正常工作。但是我不想更改代码。
KeyStore keystore = KeyStore.getInstance("PKCS12");  

我该如何将 pfx 文件转换成以下内容所接受的格式?
KeyStore kStore = KeyStore.getInstance(KeyStore.getDefaultType());    
2个回答

2
证书相关的事情从来都不简单。您需要使用openssl(Cygwin版本适用于Windows)将pfx / p12文件转换为pem文件,然后可以从pem创建证书。最后,您可以使用Java的keytool程序将证书转换为JKS格式(KeyStore默认格式)。
将pfx转换为pem:
openssl pkcs12 -in whatever.pfx -out whatever.pem -clcerts -nokeys

从pem文件创建X509证书:

openssl x509 -in whatever.pem -inform PEM -out whatever.crt -outform DER

使用Java的keytool从证书中创建一个JKS文件:
keytool -import -trustcacerts -keystore whatever.jks -storepass somepassword -noprompt -file whatever.crt -alias localhost

注意-alias可以是您想要用于此证书的任何唯一名称。约定是使用您网站的URL。

现在,您应该能够在您的代码中使用KeyStore实例加载JKS文件。也许更容易的方法是仅更改您的Java代码以使用PKCS12实例?


0
如果我更新为以下内容,它可以工作。但我不想改变代码。 KeyStore keystore = KeyStore.getInstance("PKCS12"); 如何将pfx文件转换为以下格式可接受的格式 KeyStore kStore = KeyStore.getInstance(KeyStore.getDefaultType());
为什么不呢? Java的默认密钥库格式是JKS。
但是还有其他格式,PKCS12是最常用的。
如果您需要应用程序更加“健壮”,我建议不要将您拥有的文件转换为JKS格式。
相反,您可以支持多个格式,例如尝试默认密钥库类型,如果失败,则尝试PKCS12。
我进一步建议将KeyStore.getInstance(KeyStore.getDefaultType()); 替换为类似于:

KeyStore.getInstance(UserPreferences.getDefaultType());

用户选择了默认的密钥库文件(可以是#PKCS12)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接