如何在java中从pkcs12创建私钥

mbyulnm0  于 2023-02-28  发布在  Java
关注(0)|答案(2)|浏览(523)

我需要从pkcs12格式的privateKeyContent创建PrivateKey。下面的代码不适用。

KeyFactory kf = KeyFactory.getInstance("RSA");
   PKCS8EncodedKeySpec keySpecPKCS8 = new PKCS8EncodedKeySpec(Base64.getDecoder().decode(privateKeyContent));
   PrivateKey privateRsaKey = kf.generatePrivate(keySpecPKCS8);

它给了我这个错误。

java.security.spec.InvalidKeySpecException: java.security.InvalidKeyException: IOException : version mismatch: (supported:     00, parsed:     03
    at java.base/sun.security.rsa.RSAKeyFactory.engineGeneratePrivate(RSAKeyFactory.java:251)
    at java.base/java.security.KeyFactory.generatePrivate(KeyFactory.java:390)

如何在java中正确地做到这一点?

rfbsl7qr

rfbsl7qr1#

PKCS12格式是一个可能具有多个密钥和证书的容器。PKCS8文件始终具有一个密钥。在代码示例中,您将PKCS8EncodedKeySpec应用于PKCS12输入,因此这显然不起作用。您需要从密钥级别API切换到密钥库API。
您可以像这样读取PKCS12容器:

InputStream keyFile = ...; //input stream to key file
KeyStore ks = KeyStore.getInstance("PKCS12");
ks.load(keyFile, "<filePassword>".toCharArray());

并从加载的存储器中提取特定密钥:

String keyAlias = "1"; // all existing aliases can be obtained by ks.aliases()
Key key = ks.getKey(keyAlias, "<keyPassword>".toCharArray());

下面是从this specific demo .p12 file读取密钥的方法:

InputStream keyFile = ...; // load file as an IS
KeyStore ks = KeyStore.getInstance("PKCS12");
ks.load(keyFile, null);
Key key = ks.getKey("1", "test".toCharArray());
toe95027

toe950272#

您的密钥似乎不是RSA密钥。
在使用密钥之前,您可能需要先转换密钥。例如:

openssl pkcs8 -topk8 -nocrypt -in key.pem -out new-key.pem

有关详细信息,请参阅JAVA 11 - elliptic curve private key - Caused by: java.security.InvalidKeyException: IOException : version mismatch: (supported: 00, parsed: 01

相关问题