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

时间:2012-01-28 16:07:43

标签: java openssl ssl-certificate keystore public-key-encryption

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

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 个答案:

答案 0 :(得分: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从cert:

创建JKS文件
keytool -import -trustcacerts -keystore whatever.jks -storepass somepassword -noprompt -file whatever.crt -alias localhost

请注意,-alias可以是您要用于此证书的任何唯一名称。惯例是使用您网站的URL。

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

答案 1 :(得分:0)

  

如果我更新以使用以下它可以工作。但我不想改变   代码。

     

KeyStore keystore = KeyStore.getInstance(“PKCS12”);我怎么能够   将pfx文件转换为将被接受的格式   以下

     

KeyStore kStore = KeyStore.getInstance(KeyStore.getDefaultType());

为什么不呢? Java的默认密钥库格式是JKS。

但是还有其他格式,#PKCS12是最常用的格式。

如果您需要应用程序更“强大”,我建议不要将您拥有的文件转换为JKS格式。

相反,您可以支持的不仅仅是JKS,例如尝试默认的密钥库类型,如果失败,请尝试#PKCS12

我会更进一步,建议将KeyStore.getInstance(KeyStore.getDefaultType());替换为:

KeyStore.getInstance(UserPreferences.getDefaultType());

用户选择哪个应该是默认密钥库文件(可能是#PKCS12)