#java #ibm-mq #tls1.2
#java #ibm-mq #tls1.2
Вопрос:
Я новичок в TLS на Java. У меня есть файлы с расширениями KDB, RDB и STN. Как я могу настроить хранилище ключей JKS и использовать его в приложении Java для реализации TLS, которое использует IBM WebSphere MQ client?
Мои сомнения:
- Могу ли я использовать ikeyman для преобразования?
- Могу ли я конвертировать файлы KDB непосредственно в хранилище ключей JKS?
- Нужны ли мне какие-либо другие сертификаты для внедрения TLS в тестовое приложение IBM native MQ?
- Как я могу добавить параметры TLS в IBM Native MQ API?
Я пытался запустить ikeyman. Но я не могу.
Комментарии:
1. Помогло ли вам одно из определений ответов решить вашу проблему? Если это произошло, пожалуйста, примите это.
Ответ №1:
Вы не указываете, какую версию клиента MQ вы используете, для целей этого ответа я предполагаю, что вы используете клиент MQ 7.1 или более поздней версии.
Вы можете создать хранилище ключей Java (jks) из исходного файла kdb.
Для выполнения этого потребуется два шага:
-
Создайте пустое хранилище ключей Java (jks):
runmqckm -keydb -create -db target.jks -type jks
Появится запрос на ввод пароля, который будет использоваться для защиты файла jks. -
Импортируйте все сертификаты из исходного файла kdb в целевой файл jks, созданный выше:
runmqckm -cert -import -db source.kdb -type cms -target target.jks -target_type jks
При этом будет предложено ввести два пароля, первый — пароль файла kdb, второй — пароль файла jks. Если вы добавите флаг ‘-stashed’, это устранит первое запрос пароля. -
Затем вы можете перечислить сертификаты, содержащиеся как в kdb, так и в jks, чтобы сравнить и подтвердить, что все сертификаты были скопированы:
runmqckm -cert -list -db source.kdb -type cms -stashed
Приведенная выше команда не будет запрашивать пароль из-за-stashed
флага.runmqckm -cert -list -db target.jks -type jks
Приведенная выше команда запросит пароль jks.
Примечания
- Файлы kdb / rdb / sth вместе представляют хранилище ключей IBM Certificate Management Services (CMS).
- Существует
-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.