生成私钥的问题

时间:2016-06-10 08:20:39

标签: java key private-key key-pair

私钥生成

          public PrivateKey getStoredPrivateKey(String filePath) {
    PrivateKey privateKey = null;
    byte[] keydata = getKeyData(filePath);
    PKCS8EncodedKeySpec encodedPrivateKey = new PKCS8EncodedKeySpec(keydata);
    KeyFactory keyFactory = null;
    try {
        keyFactory = KeyFactory.getInstance("RSA");
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    }
    try {
        System.out.println("hello");
        privateKey = keyFactory.generatePrivate(encodedPrivateKey);
    } catch (InvalidKeySpecException e) {
        e.printStackTrace();
    }
    return privateKey;
}

我在这里使用

  PrivateKey privateKey = new KryptoUtil().getStoredPrivateKey(privateKeyFilePath);

但显示错误

    hello
    java.security.spec.InvalidKeySpecException:                          
    java.security.InvalidKeyException: IOException : version mismatch: (supported:     00, parsed:     03
at sun.security.rsa.RSAKeyFactory.engineGeneratePrivate(Unknown Source)

我在getStoredPrivateKey(String filePath)函数中传递(.p12)文件。

为什么给出错误?

1 个答案:

答案 0 :(得分:1)

P12是密钥库类型,其中可以存储多个密钥和证书,并且可以使用密码来保护它们。您可以在Internet上搜索P12(PKCS12)。您的文件是P12文件,因此很可能是PKCS12格式文件。

要从P12文件获取私钥,请使用下面的代码。在调用此代码之前,您需要以下内容。

  

<强>文件路径即可。 P12文件的字符串路径(绝对值)。

     

<强> filePassword 即可。这是一个char []。代表p12文件的密码。

     

<强> keyPassword 即可。这是一个char []。表示私钥的密码。最   可能与filePassword相同。

     

<强>别名即可。一个字符串。表示存储在P12中的私钥的别名   存档/密钥库。

要检查私钥的别名,可以使用以下命令

keytool -list -v -keystore <yourfile>.p12 -storetype pkcs12

它会要求输入密码然后打印多行。寻找

Entry Type: PrivatKeyEntry

在那里你会找到别名。

初始化这些变量,然后使用下面的代码获取私钥。您还可以获得与此密钥关联的证书/公钥。寻找PrivateKeyEntry的API

KeyStore keyStore = KeyStore.getInstance("PKCS12");
keyStore.load(new FileInputStream(filePath), filePassword);
PrivateKeyEntry keyEntry = (PrivateKeyEntry) ks.getEntry(alias, new KeyStore.PasswordProtection(keyPassword));
PrivateKey key = privateKeyEntry.getPrivateKey();