4

我使用以下命令从 PKCS12 文件创建了私钥:

openssl pkcs12 -in test.p12 -nocerts -out privateKey.pem

privateKey.pem我现在如何从这个文件创建 PrivateKey 对象?

我尝试使用以下代码使用 PKCS12 文件本身:

 KeyStore pfx = KeyStore.getInstance("pkcs12");
 pfx.load(new FileInputStream(P12), "123456".toCharArray());
 final Enumeration<String> aliases = pfx.aliases(); //this is empty

pfx.aliases()- 是空的,我使用 keytool 验证它确实是空的,没有条目。

keytool -v -list -storetype pkcs12 -keystore test.p12

Keystore type: PKCS12
Keystore provider: SunJSSE

Your keystore contains 0 entries

我的问题是如何使用如下代码创建 PrivateKey:

 public static RSAPrivateKey getPrivateKey(File privateKeyFile) throws IOException {
        byte[] keyBytes = new byte[(int) privateKeyFile.length()];
        FileInputStream fis = new FileInputStream(privateKeyFile);
        fis.read(keyBytes);
        PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(keyBytes);// it works only with PKCS8
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
        RSAPrivateKey privKey = (RSAPrivateKey) keyFactory.generatePrivate(spec);
        return privKey;
    }

这段代码的问题只适用于PKCS8,我需要这样的PKCS12。

4

3 回答 3

2

我知道的唯一方法有点低级,但它有效:

public PrivateKey getPrivateKey(File file) throws IOException, GeneralSecurityException {
    try (FileInputStream fileStream = new FileInputStream(file);
         DataInputStream dataStream = new DataInputStream(fileStream)) {
        byte[] keyBytes = new byte[(int) file.length()];
        dataStream.readFully(keyBytes);
        String temp = new String(keyBytes);
        String header = temp.replace("-----BEGIN PRIVATE KEY-----\n", "");
        header = header.replace("-----END PRIVATE KEY-----", "");
        byte[] decoded = new Base64().decode(header);
        PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(decoded);
        KeyFactory kf = KeyFactory.getInstance("RSA");
        return kf.generatePrivate(spec);
    }
}

此代码假定所需的密钥是 RSA 密钥。

于 2013-09-05T19:35:06.983 回答
0

您可以尝试使用我们使用的 KeyStore Explorer ( https://keystore-explorer.org/ ),而不是 Java Keytool (因为我觉得它很难使用)。

于 2019-04-30T06:15:06.857 回答
-1

也许这会对某人有所帮助。

以下是从 pkcs12 证书文件生成私钥的方法。

public PrivateKey getPrivateKey(String pathToPKCS12File) {
    try {
        InputStream stream = new FileInputStream(new File(pathToPKCS12File));
        KeyStore ks = KeyStore.getInstance("PKCS12");
        ks.load(stream, "123456".toCharArray());
        return (PrivateKey) ks.getKey(
            ks.aliases.nextElement(),
            "123456".toCharArray()
        );
    } catch (Exception e) {
        //error
    }
}
于 2020-06-03T10:33:35.907 回答