12

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
----- BEGIN RSA PRIVATE KEY -----
Proc-Type:4、
ENCRYPTED DEK-Info:DES-EDE3-CBC、EA1DBF8D142621BF

BYyZuqyqq9 + L0UT8UxwkDHX7P7YxpKugTXE8NCLQWhdS3EksMsv4xNQsZSVrJxE3
Ft9veWuk + PlFVQG2utZlWxTYsUVIJg4KF7EgCbyPbN1cyjsi9FMfmlPXQyCJ72rd
...
...
cBlG80PT4t27h01gcCFRCBGHxiidh5LAATkApZMSfe6BBv4hYjkCmg ==
----- END RSA PRIVATE KEY -----
///////////////////// /////////////////////////////////////////

以下は私が試したことです

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:無効なキー形式"

助けてください。

4

1 に答える 1

15

秘密鍵がDER形式であり、正しいkeyspecを使用していることを確認してください。ここでprivkeybytesにPKCS8を使用する必要があると思います

まず、秘密鍵をバイナリ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);
    }
于 2011-09-23T12:39:57.680 に答える