从 PKCS12 文件导出公钥和私钥
Export PublicKey and PrivateKey from PKCS12 file
我有一个 .p12 文件,我想导出一个 public 和私钥。我使用了这个方法:
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()));
所以我的问题是为什么第一个 public 键与第三种方法相同但与第二种方法不同。我应该如何导出此密钥?
谢谢回复
在第一个示例中,您正在读取 PKCS12 类型的密钥库文件。在密钥库中,插入一个或多个私钥。对于每个私钥条目,存在一个证书或一个包含许多证书的证书链。因此,在这里通过提供正确的别名和密钥库密码,您将同时获得私钥和证书。从证书中,您将获得它的 public 密钥
在第二个示例中,您仅从密钥库文件中获取证书。所以,在这里您获得的不是 public 密钥,而是包含 public 密钥的证书。为了从证书中获取 public 密钥,运行 在您的命令之后执行以下命令:
openssl x509 -inform pem -in certificate.der -pubkey -noout > publickey.pem
现在,在第三个示例中,您已经有了要读取的证书文件。您正在读取证书并从证书中获取 public 密钥。
希望它能消除您的困惑。
我有一个 .p12 文件,我想导出一个 public 和私钥。我使用了这个方法:
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()));
所以我的问题是为什么第一个 public 键与第三种方法相同但与第二种方法不同。我应该如何导出此密钥? 谢谢回复
在第一个示例中,您正在读取 PKCS12 类型的密钥库文件。在密钥库中,插入一个或多个私钥。对于每个私钥条目,存在一个证书或一个包含许多证书的证书链。因此,在这里通过提供正确的别名和密钥库密码,您将同时获得私钥和证书。从证书中,您将获得它的 public 密钥
在第二个示例中,您仅从密钥库文件中获取证书。所以,在这里您获得的不是 public 密钥,而是包含 public 密钥的证书。为了从证书中获取 public 密钥,运行 在您的命令之后执行以下命令:
openssl x509 -inform pem -in certificate.der -pubkey -noout > publickey.pem
现在,在第三个示例中,您已经有了要读取的证书文件。您正在读取证书并从证书中获取 public 密钥。
希望它能消除您的困惑。