Может ли org.bouncycastle.openssl.PEMReader читать java.security.PrivateKey?

У меня есть следующий код:

PrivateKey key = null;
X509Certificate cert = null;
KeyPair keyPair = null;

final Reader reader = new StringReader(pem);
try {
    final PEMReader pemReader = new PEMReader(reader, new PasswordFinder() {
        @Override
        public char[] getPassword() {
            return password == null ? null : password.toCharArray();
        }
    });

    Object obj;
    while ((obj = pemReader.readObject()) != null) {
        if (obj instanceof X509Certificate) {
            cert = (X509Certificate) obj;
        } else if (obj instanceof PrivateKey) {
            key = (PrivateKey) obj;
        } else if (obj instanceof KeyPair) {
            keyPair = (KeyPair) obj;
        }
    }
} finally {
    reader.close();
}

Будет ли он когда-нибудь читать PrivateKey? Другими словами, может ли любой файл PEM содержать только чистый закрытый ключ? Если да, не могли бы вы предоставить мне образец файла PEM?

Заранее спасибо.


person Martin Ždila    schedule 24.11.2011    source источник
comment
У меня нет под рукой образца, но вы можете прочитать здесь: ospkibook.sourceforge.net/docs/OSPKI-2.4.7/OSPKI-html/ возможно. (или это попытка получить приват-ключи от людей :))   -  person albertjan    schedule 25.11.2011
comment
См. также Форматирование ключей RSA для OpenSSL в Java.   -  person erickson    schedule 25.11.2011


Ответы (1)


Файл может содержать только закрытый ключ и может быть зашифрован или содержать открытый текст. OpenSSL делает это постоянно.

Однако я просмотрел код для PEMReader, и похоже, что он вернет KeyPair из закрытого ключа RSA (файл закрытого ключа содержит всю необходимую информацию для соответствующего открытого ключа). Похоже, он никогда не вернет просто PrivateKey из readObject().

Вот незашифрованный закрытый ключ 1024 RSA от OpenSSL.

-----BEGIN RSA PRIVATE KEY-----
MIICXQIBAAKBgQC/oBTZGo0cgHHdZD8LgDpUVOPjsI58PrTJPtrlVT7kyznmzFEt
TW9cqxlw6EOo09tTTrjikLDA2M5xzejbLGPb8sa7AzVhuHkChgGh9eZmphsnvq1W
LjuXCk5yWOR9ziaBKKFeNXOsdvDp3eMDM+wz3vzn1wrGrg00jMvKP5kcpwIDAQAB
AoGBAI9oJ/IKEszfu1cqLJxYzE5McXf2q8uDyhxJs9upHjZveNem1KGIr+y0B4gd
6nSwiBUidu7nxb+tAWLd7IQKBnhKC3AtGNT7qTwnXelKsJhaok2+kEEuzjQYnmsP
AreEsAi/FlHj/kAyjGBoQ4QLrx1sp2cDcBTP78PeJfZvm/RxAkEA7zVuumjrz3ui
zmBzQI1pwD9F0REyE5zJfgUz5iDQbK2RRPhcQ9LCZdEJRU0vdWTBmmgadYwpg0uG
hYFwCy7PWwJBAM0Tk+pMRwke0m4oiI4mKh0u4enHXE2RFMUtTMjGILHt8+m4Q7rd
KGfO9/ylK82LhbT0Z/BeszbnneaAefkxFaUCQQDephVSXKZgkOuQvCWKSBXOYxZQ
6nh52M2TBrSv1ospHMTCNYlrd5iJvG+smZM66XVqistV7ggVtQ6Y5Umsnv1RAkBW
l/K4V1cTcdFXNIRcyZ60zewUw9qk4iMME1G94XNCzoBU6zqmN+Zs1wb9xlzVoRln
TGBrLgGsqGaTQyK9500FAkBuKohFvOgFHSKOskiVu/swByWZANEZsoEPUx7V6vXH
Tk+qftY64tt4AazHPVyVtsj1oqOv3zbulfnotFvU1nmp
-----END RSA PRIVATE KEY-----

Вот соответствующий открытый ключ:

-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC/oBTZGo0cgHHdZD8LgDpUVOPj
sI58PrTJPtrlVT7kyznmzFEtTW9cqxlw6EOo09tTTrjikLDA2M5xzejbLGPb8sa7
AzVhuHkChgGh9eZmphsnvq1WLjuXCk5yWOR9ziaBKKFeNXOsdvDp3eMDM+wz3vzn
1wrGrg00jMvKP5kcpwIDAQAB
-----END PUBLIC KEY-----

KeyStore предназначен для переноса открытых, закрытых и симметричных ключей в приложение Java. Большинство приложений Java хранят закрытые ключи в кодировке PKCS #8 (которая не такая же, как в формате OpenSSL), а общедоступные ключи представлены в виде структуры SubjectPublicKeyInfo (которая то же самое, что и OpenSSL).

person erickson    schedule 24.11.2011
comment
Спасибо за ответ. Ваш образец закрытого ключа содержит также открытый ключ и, следовательно, является KeyPair. Вы можете извлечь открытый ключ с помощью: openssl pkey -inform PEM -pubout -outform PEM. Мне было интересно, может ли быть PEM только с чистым закрытым ключом, без информации об открытом ключе. - person Martin Ždila; 25.11.2011
comment
@Martin На самом деле мой образец содержит RSAPrivateKey, как определено PKCS #1. Как я уже сказал, он действительно содержит открытый показатель степени (вместе со значениями китайской теоремы об остатках), чтобы облегчить восстановление открытого ключа. Любой закрытый ключ, который может быть прочитан PEMReader (или утилитами OpenSSL), должен быть в этом стандартном формате, хотя он может быть заключен в оболочку PKCS #8 или PEM. Некоторые реализации SSH2 необычны тем, что не используют ключ PKCS #1. PEMReader никогда не вернет PrivateKey; это вызовет исключение, если закрытый ключ не в формате PKCS # 1. - person erickson; 25.11.2011