Преобразование KDB в хранилище ключей JKS

#java #ibm-mq #tls1.2

#java #ibm-mq #tls1.2

Вопрос:

Я новичок в TLS на Java. У меня есть файлы с расширениями KDB, RDB и STN. Как я могу настроить хранилище ключей JKS и использовать его в приложении Java для реализации TLS, которое использует IBM WebSphere MQ client?

Мои сомнения:

  1. Могу ли я использовать ikeyman для преобразования?
  2. Могу ли я конвертировать файлы KDB непосредственно в хранилище ключей JKS?
  3. Нужны ли мне какие-либо другие сертификаты для внедрения TLS в тестовое приложение IBM native MQ?
  4. Как я могу добавить параметры TLS в IBM Native MQ API?

Я пытался запустить ikeyman. Но я не могу.

Комментарии:

1. Помогло ли вам одно из определений ответов решить вашу проблему? Если это произошло, пожалуйста, примите это.

Ответ №1:

Вы не указываете, какую версию клиента MQ вы используете, для целей этого ответа я предполагаю, что вы используете клиент MQ 7.1 или более поздней версии.


Вы можете создать хранилище ключей Java (jks) из исходного файла kdb.

Для выполнения этого потребуется два шага:

  1. Создайте пустое хранилище ключей Java (jks):

    runmqckm -keydb -create -db target.jks -type jks
    Появится запрос на ввод пароля, который будет использоваться для защиты файла jks.

  2. Импортируйте все сертификаты из исходного файла kdb в целевой файл jks, созданный выше:

    runmqckm -cert -import -db source.kdb -type cms -target target.jks -target_type jks
    При этом будет предложено ввести два пароля, первый — пароль файла kdb, второй — пароль файла jks. Если вы добавите флаг ‘-stashed’, это устранит первое запрос пароля.

  3. Затем вы можете перечислить сертификаты, содержащиеся как в kdb, так и в jks, чтобы сравнить и подтвердить, что все сертификаты были скопированы:

    runmqckm -cert -list -db source.kdb -type cms -stashed
    Приведенная выше команда не будет запрашивать пароль из-за -stashed флага.

    runmqckm -cert -list -db target.jks -type jks
    Приведенная выше команда запросит пароль jks.


Примечания

  1. Файлы kdb / rdb / sth вместе представляют хранилище ключей IBM Certificate Management Services (CMS).
  2. Существует -keydb -convert параметр, который указывает, что он должен иметь тот же результат, что и два шага, которые я предоставил выше, однако я отметил, что он не всегда копирует все сертификаты.

Комментарии:

1. Спасибо, это чрезвычайно полезный и подробный ответ.

Ответ №2:

Я не думаю, что вы сможете, но вы можете использовать key tool для создания .jks ключевого камня и импортировать сертификат сервера или сертификат truststore.

 keytool -keystore clientkey.jks -storetype jks -importcert -file servercert.pem -alias server-cert
  

Посмотрите в разделе TLS в https://github.com/ibm-messaging/mq-dev-patterns

Ответ №3:

Java поддерживает типы хранилищ ключей JKS и PKCS12. Также проводится различие между хранилищем ключей (которое содержит клиентские сертификаты) и хранилищем доверия (которое содержит доверенные сертификаты). Необходимы как хранилище ключей, так и trustStore.

Клиентские сертификаты (хранилище ключей) могут быть экспортированы из .kdb непосредственно командой gsk8capicmd_64:

 gsk8capicmd_64 -cert -export -db file.kdb -pw your_password -target file.p12 -target_pw your_password
  

TrustStore .jks можно создать, экспортировав доверенные сертификаты из .kdb и вставив их в new .jks:

 for CERT_LABEL in $(gsk8capicmd_64 -cert -list -db file.kdb -pw your_password | grep ^! | cut -f2);
do
    gsk8capicmd_64 -cert -extract -db file.kdb -pw your_password -label ${CERT_LABEL} -target temp.cert;
    yes | keytool -importcert -alias ${CERT_LABEL} -file temp.cert -keystore file.jks -storepass your_password;
done;
  

Хранилище ключей и trustStore могут быть затем настроены в командной строке или непосредственно в коде таким образом:

 System.setProperty("javax.net.ssl.keyStore", "file.p12");
System.setProperty("javax.net.ssl.keyStorePassword", "your_password");
System.setProperty("javax.net.ssl.keyStoreType", "pkcs12");
System.setProperty("javax.net.ssl.trustStore", "file.jks");
System.setProperty("javax.net.ssl.trustStorePassword", "your_password");
System.setProperty("javax.net.ssl.trustStoreType", "jks");
  

Комментарии:

1. Смотрите мой ответ, вы можете сделать то же самое непосредственно в jks с помощью двух команд, цикл не требуется, используя команду runmqckm, которая поставляется с IBM MQ.