Как импортировать существующий сертификат X.509 и закрытый ключ в хранилище ключей Java для использования в SSL? - PullRequest
206 голосов
/ 25 мая 2009

У меня есть это в конфигурации ActiveMQ:

<sslContext>
        <sslContext keyStore="file:/home/alex/work/amq/broker.ks"  
 keyStorePassword="password" trustStore="file:${activemq.base}/conf/broker.ts" 
 trustStorePassword="password"/>
</sslContext>

У меня есть пара сертификатов X.509 и файл ключей.

Как мне импортировать эти два файла, чтобы использовать их в соединителях SSL и SSL + stomp? Все примеры, которые я мог гуглить, всегда генерируют ключ сами, но у меня уже есть ключ.

Я пытался

keytool -import  -keystore ./broker.ks -file mycert.crt

, но при этом импортируется только сертификат, а не файл ключа, и получается

2009-05-25 13:16:24,270 [localhost:61612] ERROR TransportConnector - Could not accept connection : No available certificate or key corresponds to the SSL cipher suites which are enabled.

Я попытался объединить сертификат и ключ, но получил тот же результат.

Как импортировать ключ?

Ответы [ 15 ]

2 голосов
/ 18 марта 2019

То, чего я пытался добиться, - это использовать уже предоставленный закрытый ключ и сертификат для подписи сообщения, которое отправлялось куда-то, что требовалось для того, чтобы убедиться, что сообщение исходит от меня (закрытые ключи подписываются, пока открытые ключи шифруются).

Итак, если у вас уже есть файл .key и файл .crt?

Попробуйте это:

Шаг 1: Преобразование ключа и сертификата в файл .p12

openssl pkcs12 -export -in certificate.crt -inkey privateKey.key -name alias -out yourconvertedfile.p12

Шаг 2: Импортировать ключ и создать файл .jsk с помощью одной команды

keytool -importkeystore -deststorepass changeit -destkeystore keystore.jks -srckeystore umeme.p12 -srcstoretype PKCS12

Шаг 3: В вашей Java:

char[] keyPassword = "changeit".toCharArray();

KeyStore keyStore = KeyStore.getInstance("JKS");
InputStream keyStoreData = new FileInputStream("keystore.jks");

keyStore.load(keyStoreData, keyPassword);
KeyStore.ProtectionParameter entryPassword = new KeyStore.PasswordProtection(keyPassword);
KeyStore.PrivateKeyEntry privateKeyEntry = (KeyStore.PrivateKeyEntry)keyStore.getEntry("alias", entryPassword);

System.out.println(privateKeyEntry.toString());

Если вам нужно подписать какую-либо строку с помощью этого ключа, сделайте следующее:

Шаг 1: преобразовать текст, который вы хотите зашифровать

byte[] data = "test".getBytes("UTF8");

Шаг 2: Получить закрытый ключ в кодировке base64

keyStore.load(keyStoreData, keyPassword);

//get cert, pubkey and private key from the store by alias
Certificate cert = keyStore.getCertificate("localhost");
PublicKey publicKey = cert.getPublicKey();
KeyPair keyPair = new KeyPair(publicKey, (PrivateKey) key);

//sign with this alg
Signature sig = Signature.getInstance("SHA1WithRSA");
sig.initSign(keyPair.getPrivate());
sig.update(data);
byte[] signatureBytes = sig.sign();
System.out.println("Signature:" + Base64.getEncoder().encodeToString(signatureBytes));

sig.initVerify(keyPair.getPublic());
sig.update(data);

System.out.println(sig.verify(signatureBytes));

Ссылка:

  1. Как импортировать существующий сертификат x509 и закрытый ключ в хранилище ключей Java для использования в SSL?
  2. http://tutorials.jenkov.com/java-cryptography/keystore.html
  3. http://www.java2s.com/Code/Java/Security/RetrievingaKeyPairfromaKeyStore.htm
  4. Как подписать строку закрытым ключом

Финальная программа

public static void main(String[] args) throws Exception {

    byte[] data = "test".getBytes("UTF8");

    // load keystore
    char[] keyPassword = "changeit".toCharArray();

    KeyStore keyStore = KeyStore.getInstance("JKS");
    //System.getProperty("user.dir") + "" < for a file in particular path 
    InputStream keyStoreData = new FileInputStream("keystore.jks");
    keyStore.load(keyStoreData, keyPassword);

    Key key = keyStore.getKey("localhost", keyPassword);

    Certificate cert = keyStore.getCertificate("localhost");

    PublicKey publicKey = cert.getPublicKey();

    KeyPair keyPair = new KeyPair(publicKey, (PrivateKey) key);

    Signature sig = Signature.getInstance("SHA1WithRSA");

    sig.initSign(keyPair.getPrivate());
    sig.update(data);
    byte[] signatureBytes = sig.sign();
    System.out.println("Signature:" + Base64.getEncoder().encodeToString(signatureBytes));

    sig.initVerify(keyPair.getPublic());
    sig.update(data);

    System.out.println(sig.verify(signatureBytes));
}
2 голосов
/ 16 января 2019

Если у вас есть файл PEM (например, server.pem), содержащий:

  • доверенный сертификат
  • закрытый ключ

затем вы можете импортировать сертификат и ключ в хранилище ключей JKS следующим образом:

1 ) Скопируйте закрытый ключ из файла PEM в файл ASCII (например, server.key)

2 ) Скопируйте сертификат из файла PEM в файл ASCII (например, server.crt)

3 ) Экспортируйте сертификат и ключ в файл PKCS12:

$ openssl pkcs12 -export -in server.crt -inkey server.key \
                 -out server.p12 -name [some-alias] -CAfile server.pem -caname root
  • файл PEM можно использовать в качестве аргумента опции -CAfile .
  • вам будет предложено ввести пароль для экспорта.
  • если вы делаете это в git bash, то добавьте winpty в начало команды, чтобы можно было ввести пароль экспорта.

4 ) Преобразовать файл PKCS12 в хранилище ключей JKS:

$ keytool -importkeystore -deststorepass changeit -destkeypass changeit \
          -destkeystore keystore.jks  -srckeystore server.p12 -srcstoretype PKCS12 \
          -srcstorepass changeit
  • пароль srcstorepass должен совпадать с паролем экспорта из шага 3)
1 голос
/ 31 декабря 2018

Просто создайте хранилище ключей PKCS12, Java может использовать его прямо сейчас. Фактически, если вы перечислите хранилище ключей в стиле Java, само средство keytool предупредит вас о том, что PKCS12 теперь является предпочтительным форматом.

openssl pkcs12 -export -in server.crt -inkey server.key \
               -out server.p12 -name [some-alias] \
               -CAfile ca.crt -caname root -chain

Вы должны были получить все три файла (server.crt, server.key, ca.crt) от вашего поставщика сертификатов. Я не уверен, что на самом деле означает «-caname root», но, похоже, его нужно указывать именно таким образом.

В коде Java обязательно укажите правильный тип хранилища ключей.

KeyStore.getInstance("PKCS12")

Я получил свой сертификат SSL, выданный comodo.com, нормально работающим в NanoHTTPD.

0 голосов
/ 19 июня 2019

Использование сертификатов Let's Encrypt

Предполагая, что вы создали свои сертификаты и закрытые ключи с помощью Let's Encrypt in /etc/letsencrypt/live/you.com:

1. Создайте PKCS # 12 файл

openssl pkcs12 -export -in fullchain.pem -inkey privkey.pem -out pkcs.p12 \
        -name letsencrypt

Это объединяет ваш сертификат SSL fullchain.pem и ваш закрытый ключ privkey.pem в один файл, pkcs.p12.

Вам будет предложено ввести пароль для pkcs.p12.

Опция export указывает, что файл PKCS # 12 будет создан, а не проанализирован (из руководство ).

2. Создать хранилище ключей Java

keytool -importkeystore -destkeystore keystore.jks -srckeystore pkcs.p12 \
        -srcstoretype PKCS12 -alias letsencrypt

Если keystore.jks не существует, он будет создан с файлом pkcs.12, созданным выше. В противном случае вы импортируете pkcs.12 в существующее хранилище ключей.


Эти инструкции взяты из этого сообщения в блоге .

Вот еще о различных типах файлов в /etc/letsencrypt/live/you.com.

0 голосов
/ 21 марта 2019

в случае эллиптической кривой и ответа на вопрос импорт существующего сертификата x509 и личного ключа в хранилище ключей Java , возможно, вы захотите взглянуть и на эту тему Как читать EC Private введите Java, который находится в формате файла .pem

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...