Как использовать .key и .crt файл в java, сгенерированный openssl? - PullRequest
13 голосов
/ 26 июня 2011

Мне нужно асимметричное шифрование в Java. Я генерирую .key и .crt файлы с собственным паролем и .crt файлом с помощью openssl, который сказал в http://www.imacat.idv.tw/tech/sslcerts.html.
Как использовать эти .key и .crt файл для извлечения открытого ключа и закрытого ключа в Java?

Ответы [ 4 ]

20 голосов
/ 26 июня 2011

Ваши файлы .key и .crt могут быть в формате PEM.Чтобы проверить это, откройте их в текстовом редакторе и проверьте, выглядит ли содержимое как ------BEGIN CERTIFICATE------ (или «начать секретный ключ RSA» ...).Как правило, это формат по умолчанию, используемый OpenSSL, если вы не указали явно DER.

Возможно, он не требуется (см. Ниже), но если ваш сертификат в формате DER (двоичный формат), вы можете преобразоватьих в формате PEM, используя:

openssl x509 -inform DER -in cert.crt -outform PEM -out cert.pem

(Проверьте справку для openssl rsa, чтобы сделать что-то похожее с закрытым ключом, если необходимо.)

Затем вы получите два варианта:

  • Создание файла PKCS # 12

    openssl pkcs12 -export -in myhost.crt -inkey myhost.key -out myhost.p12
    

Затем его можно использовать непосредственно из Java в качестве хранилища ключей типа "PKCS12".Большинство приложений Java должны позволять вам указывать тип хранилища ключей в дополнение к расположению файла.Для системных свойств по умолчанию это делается с javax.net.ssl.keyStoreType (но приложение, которое вы используете, может не использовать это).В противном случае, если вы хотите загрузить его явно, используйте что-то вроде этого:

KeyStore ks = KeyStore.getInstance("PKCS12");
FileInputStream fis =
    new FileInputStream("/path/to/myhost.p12");
ks.load(fis, "password".toCharArray()); // There are other ways to read the password.
fis.close();

(Тогда вы сможете перебирать aliases() из KeyStore ииспользуйте getCertificate (а затем getPublicKey() для открытого ключа) и getKey().

  • Используйте BouncyCastle * PEMReader.

     FileReader fr = ... // Create a FileReader for myhost.crt
     PEMReader pemReader = new PEMReader(fr);
     X509Certificate cert = (X509Certificate)pemReader.readObject();
     PublicKey pk = cert.getPublicKey();
     // Close reader...
    

Для закрытого ключа вам необходимо реализовать PasswordFinder (см. Ссылку в документе PEMReader) для создания PEMReader, если закрытый ключзащищен паролем. (Вам нужно будет преобразовать результат readObject() в Key или PrivateKey.)

3 голосов
/ 23 марта 2012

Это должно сделать то, что вы хотите сделать (используя BouncyCastle PEMReader, как предложено выше) - взять PEM-кодированный закрытый ключ + сертификат и вывести файл PKCS # 12. Использует тот же пароль для PKCS12, который использовался для защиты закрытого ключа.

public static byte[] pemToPKCS12(final String keyFile, final String cerFile, final String password) throws Exception {
    // Get the private key
    FileReader reader = new FileReader(keyFile);

    PEMReader pem = new PEMReader(reader, new PasswordFinder() {
        @Override public char[] getPassword() {
            return password.toCharArray();
        }
    });

    PrivateKey key = ((KeyPair)pem.readObject()).getPrivate();

    pem.close();
    reader.close();

    // Get the certificate      
    reader = new FileReader(cerFile);
    pem = new PEMReader(reader);

    X509Certificate cert = (X509Certificate)pem.readObject();

    pem.close();
    reader.close();

    // Put them into a PKCS12 keystore and write it to a byte[]
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    KeyStore ks = KeyStore.getInstance("PKCS12");
    ks.load(null);
    ks.setKeyEntry("alias", (Key)key, password.toCharArray(), new java.security.cert.Certificate[]{cert});
    ks.store(bos, password.toCharArray());
    bos.close();
    return bos.toByteArray();
}
1 голос
/ 26 июня 2011

Насколько я понимаю, OpenSSL сохранил файлы в так называемом формате PEM.Вам нужно преобразовать его в формат Java Key Storage (JKS), а затем работать с этим форматом (который является родным для Java) для извлечения файлов.Для конвертации используйте этот запрос Google , он дает довольно хорошие результаты.

Загрузить файл JKS в класс java.security.KeyStore.Затем используйте методы getCertificate и getKey для получения необходимой информации.

1 голос
/ 26 июня 2011

Взгляните на org.bouncycastle.crypto.generators.OpenSSLPBEParametersGenerator

...