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

Java 从PKCS12文件导出公钥和私钥,java,certificate,x509certificate,keystore,Java,Certificate,X509certificate,Keystore,我有一个.p12文件,我想导出公钥和私钥。我用了这个方法: FileInputStream fm = new FileInputStream("C:\\cert.p12"); KeyStore ks = KeyStore.getInstance("PKCS12"); try { ks.load(fm, "pass".toCharArray()); } catch (Exception e) { e.printStackTrace();

我有一个.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文件加载到keystore并获取密钥

    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()));
所以我的问题是为什么第一个公钥与第三个方法相同,但与第二个方法不同。我应该如何导出此密钥?
感谢回复在第一个示例中,您正在读取PKCS12类型的密钥库文件。在密钥库中,插入一个或多个私钥。对于每个私钥条目,存在一个证书或一个包含多个证书的证书链。所以,在这里,通过提供正确的别名和密钥库密码,您可以同时获得私钥和证书。从证书中,您将获得它的公钥

在第二个示例中,您只从密钥库文件获取证书。因此,这里您得到的不是公钥,而是包含公钥的证书。要从证书获取公钥,请在命令后运行以下命令:

openssl x509 -inform pem -in certificate.der -pubkey -noout > publickey.pem
现在,在第三个示例中,您已经有了一个要读取的证书文件。您正在读取证书并从证书中获取公钥。


希望它能消除你的困惑

第二个示例导出证书,而不是密钥?我在哪里可以设置/获取它?您知道为什么我获取
key key=ks.getKey(“Certificates”,“12345678.tocharray())的key的null值吗?这个别名是干什么用的?我如何知道我的
.p12
的值是多少?