Как пользоваться.ключ и.crt-файл на java, созданный openssl?

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

4 ответов


код .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 ' s 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.)


Это должно сделать то, что вы хотите сделать (используя 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();
}

взгляните на org.после установки BouncyCastle.криптографический.генераторы.OpenSSLPBEParametersGenerator


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

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