繁体   English   中英

我如何从pfx证书中读取java中的私钥

[英]How do i read the private key in java from a pfx certificate

我试图读取私钥我java。我学会了为了做到这一点我必须从我的完整证书中提取私有密钥的pfx格式。 我已经尝试了下面的open ssl命令将pfx转换为pem然后再转换为pk8,但是当我尝试在java中读取密钥时,它表示无效的密钥格式

将pfx转换为pem

      openssl pkcs12 -in C:\Documents\xbox-token\conversion\xbox
  token-FullCert.pfx -nocerts -out C:\Documents\xbox-token\conversion\xboxkey.pem

删除密码保护

openssl rsa -in C:\Documents\xbox-token\conversion\xboxkey.pem  -out C:\Documents\xbox-token\conversion\xboxkey.pem

将pem转换为pk8

openssl pkcs8 -topk8 -in C:\Documents\xbox-token\conversion\xboxkey.pem -out C:\Documents\xbox-token\conversion\xboxprv.pk8

在java代码中

  byte[] encodedPrivateKey=null;
    File privateKeyFile = new File("C:/Documents/xbox-token/conversion/xboxprv.pk8");
    FileInputStream inputStreamPrivateKey = null;
    try {
        inputStreamPrivateKey = new FileInputStream(privateKeyFile);
          encodedPrivateKey = new byte[(int)privateKeyFile.length()];
            inputStreamPrivateKey.read(encodedPrivateKey);
            inputStreamPrivateKey.close();
    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }


    // Create the private key.
    PKCS8EncodedKeySpec privateKeySpec = new PKCS8EncodedKeySpec(encodedPrivateKey);
    System.out.println(encodedPrivateKey);
    System.out.println(privateKeySpec);
    RSAPrivateKey privateKey = null;
    try {
        privateKey = (RSAPrivateKey)KeyFactory.getInstance("RSA").generatePrivate(privateKeySpec);
    } catch (InvalidKeySpecException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (NoSuchAlgorithmException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

我收到了java.security.spec.InvalidKeySpecException:java.security.InvalidKeyException:无效的密钥格式

任何人都可以帮忙

我认为诀窍是用openssl做一点,然后让keytool做所有真正的工作。 因此,使用openssl将您现有的证书和密钥转换为PKCS12文件。 使用openssl你会有类似的东西。

openssl pkcs12 \
  -export -in cert.crt \
  -inkey cert.key \
  -certfile ica.crt \
  -name "yourKey" \
  -out cert.p12

然后神奇的是将.p12导入到您的密钥库中,就像它是另一个密钥库一样。

$JAVA_HOME/bin/keytool \
  -importkeystore -deststorepass secret \
  -destkeypass secret -destkeystore $KEYSTORE \
  -srckeystore cert.p12 \
  -srcstoretype PKCS12 \
  -srcstorepass secret \
  -alias "yourKey"

您可以选择在java中使用它,但我希望完整的答案涉及以下内容。

import java.security.KeyStore;
KeyStore trustStore  = KeyStore.getInstance(KeyStore.getDefaultType());
FileInputStream instream = new FileInputStream(new File("/your/keystore"));
trustStore.load(instream, "secret".toCharArray());

希望它有效!

如果您没有为OpenSSL命令指定输出格式,您将获得PEM编码的文件。 Java将期待DER编码。 而不是你上次的openssl调用尝试:

openssl pkcs8 -topk8 -inform=PEM -outform=DER
              -in C:\Documents\xbox-token\conversion\xboxkey.pem 
              -out C:\Documents\xbox-token\conversion\xboxprv.pk8

不应该要求'-inform'参数(似乎是默认值),但'-outform'可能是。

如果要检查您的格式:PEM文件是ASCII(Base64编码),DER文件是二进制文件。 如果您的文本编辑器喜欢它,Java可能不会。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM