如何从RSA Privatekey.pem文件中获取java.security.PrivateKey对象?

时间:2011-09-23 07:31:27

标签: java ssl jca jsse

我有一个RSA私钥文件(OCkey.pem)。使用java我必须从这个文件中获取私钥。使用下面的openssl命令生成此密钥。 注意:我无法在下面的openssl命令中更改任何内容。

openssl> req -newkey rsa:1024 -sha1 -keyout OCkey.pem -out OCreq.pem -subj "/C=country/L=city/O=OC/OU=myLab/CN=OCserverName/" -config req.conf

证书如下所示。

  

/////////////////////////////////////////////// ////////////
  bash-3.00 $ less OCkey.pem
  -----开始RSA私钥----- Proc-Type:4,ENCRYPTED
DEK-Info:DES-EDE3-CBC,EA1DBF8D142621BF

     

BYyZuqyqq9 + L0UT8UxwkDHX7P7YxpKugTXE8NCLQWhdS3EksMsv4xNQsZSVrJxE3
  Ft9veWuk + PlFVQG2utZlWxTYsUVIJg4KF7EgCbyPbN1cyjsi9FMfmlPXQyCJ72rd
  ... ... ...   cBlG80PT4t27h01gcCFRCBGHxiidh5LAATkApZMSfe6BBv4hYjkCmg ==
  ----- END RSA私钥-----
////////////////////////////////// //////////////////////////////

以下是我试过的

byte[] privKeyBytes = new byte[(int)new File("C:/OCkey.pem").length()]; 
PublicKey publicKey = KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(privKeyBytes));

但是

  

“java.security.spec.InvalidKeySpecException:   java.security.InvalidKeyException:无效的密钥格式“

请帮忙。

1 个答案:

答案 0 :(得分:13)

确保私钥是DER格式,并且您使用的是正确的keyspec。我相信你应该在这里使用PKCS8作为privkeybytes

首先,您需要将私钥转换为二进制DER格式。 下面是如何使用OpenSSL来做到这一点:

openssl pkcs8 -topk8 -inform PEM -outform DER -in private_key.pem -out private_key.der -nocrypt

最后,

public static PrivateKey getPrivateKey(String filename) throws Exception {

        File f = new File(filename);
        FileInputStream fis = new FileInputStream(f);
        DataInputStream dis = new DataInputStream(fis);
        byte[] keyBytes = new byte[(int) f.length()];
        dis.readFully(keyBytes);
        dis.close();

        PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(keyBytes);
        KeyFactory kf = KeyFactory.getInstance("RSA");
        return kf.generatePrivate(spec);
    }