Как получить объект java.security.PrivateKey из файла RSA Privatekey.pem?

У меня есть файл закрытого ключа 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$ меньше OCkey.pem
-----НАЧАТЬ ЗАКРЫТЫЙ КЛЮЧ RSA-----
Тип процедуры: 4, ЗАШИФРОВАННЫЙ
Информация о DEK: 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: неверный формат ключа»

Пожалуйста помоги.


person Kanagavelu Sugumar    schedule 23.09.2011    source источник
comment
Убедитесь, что закрытый ключ имеет формат DER и вы используете правильную спецификацию ключа. Я считаю, что вы должны использовать PKCS8 здесь для privkeybytes.   -  person Zaki    schedule 23.09.2011


Ответы (1)


Убедитесь, что закрытый ключ имеет формат DER и вы используете правильную спецификацию ключа. Я считаю, что вы должны использовать 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);
    }
person Zaki    schedule 23.09.2011
comment
Я искал способ решить эту проблему в течение нескольких дней. Отличное решение. Однако параметр PEM у меня не работал, но его пропуск не вызвал проблем. - person homaxto; 24.09.2012
comment
Извините, но вы забыли включить оператор импорта в начале своего решения. - person Moebius; 24.09.2019