从 PKCS12 文件中导出公钥和私钥

5

我有一个.p12文件,想要导出公钥和私钥。我使用了以下方法:

FileInputStream fm = new FileInputStream("C:\\cert.p12");
    KeyStore ks = KeyStore.getInstance("PKCS12");
    try {
        ks.load(fm, "pass".toCharArray());
    } catch (Exception e) {
        e.printStackTrace();
    }
    Key key = ks.getKey("cert", "pass".toCharArray());
    Certificate cert = ks.getCertificate("cert");
    PublicKey publicKey = cert.getPublicKey();
    System.out.println("Public key");
    System.out.println(Base64.getEncoder().encodeToString(
            publicKey.getEncoded()));
    fm.close();

第二种方法是使用openssl命令并将其转换为.cer文件:
openssl pkcs12 -in cert.p12 -out cert.cer -nodes

第三种方法是将此cert.cer文件加载到密钥库中并获取密钥。
    FileInputStream fm1;
    fm1 = new FileInputStream("C:\\cert.cer");
    CertificateFactory f = CertificateFactory.getInstance("X.509");
    X509Certificate certificate = (X509Certificate)f.generateCertificate(fm1);
    PublicKey pk = certificate.getPublicKey();
    System.out.println("Public key");
    System.out.println(Base64.getEncoder().encodeToString(pk.getEncoded()));

所以我的问题是,为什么第一个公钥与第三种方法中的公钥相同,但与第二种方法中的不同。我该如何导出此密钥? 感谢回答。

第二个示例导出的是证书,而不是密钥。 - user207421
1
ks.getKey("cert", "pass".toCharArray());中的cert是什么?我在哪里可以设置/获取它? - Sazzad Hissain Khan
1个回答

4
在第一个示例中,您正在读取PKCS12类型的密钥库文件。在密钥库中插入了一个或多个私钥。对于每个私钥条目,存在一个包含许多证书的证书或证书链。因此,通过提供正确的别名和密钥库密码,您可以获取私钥和证书。从证书中,您可以获取其公钥。
在第二个示例中,您仅从密钥库文件中获取证书。因此,在这里您没有获取公钥,而是包含公钥的证书。为了从证书中获取公钥,请在您的命令后运行以下命令:
openssl x509 -inform pem -in certificate.der -pubkey -noout > publickey.pem

现在,在第三个例子中,您已经有一个要读取的证书文件。您正在读取证书,并从证书中获取公钥。

希望这样可以消除您的困惑。


你知道为什么我在 Key key = ks.getKey("Certificates", "12345678".toCharArray()); 中获取到了空值吗?这个别名是什么意思?我怎样才能知道我的 .p12 的值是多少? - Sazzad Hissain Khan

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