keytool - это утилита для работы с ключами и сертификатами из
стандартного дистрибутива java. Она позволяет генерировать новые пары
закрытых/открытых ключей, управлять ими, создавать запросы на подпись,
экспортировать и импортировать сертификаты; иными словами, она умеет
делать практически всё, кроме подписывания запросов на подпись сертификата.
Далее в посте - перечень наиболее часто используемых и самых полезных команд этой классной утилиты.
N.B.#1. Как рассказывалось в предыдущем посте, хранилище ключей
keystore может иметь различные реализации. Так вот, keytool может
работать с любым файловым хранилищем, при наличии соответствующих
библиотек; для этого нужно указать тип хранилища (например, keystore.type=jks).
N.B.#2. По умолчанию - если не задать путь - создаваемое хранилище размещается в файле
.keystore в домашней директории пользователя; если хранилище с указанным
именем не существует, то оно будет создано.
N.B.#3. Ключ -v (verbose) включает вывод подробной информации. Иногда весьма полезно и интересно.
* Создание хранилища и генерация пары ключей (закрытый ключ
сохраняется под паролем, открытый ключ "оборачивается" в самоподписанный
сертификат).
Первым показан самый простой вариант команды, когда мы
только просим сгенерировать ключ; некоторая дополнительная информация
при этом будет запрошена интерактивно в процессе выполнения, а многие
параметры используются с дефолтными значениями (например, алиас - mykey,
хранилище - .keystore в домашней директории пользователя, алгоритм
шифрвания - SHA1withDSA и пр.).
Все параметры могут указывать сразу в строке команды; так, во втором
варианте примера задаётся информация о компании и пр., название алиаса,
тип и размещение хранилища, срок действия, алгоритм для генерации
ключей, размер ключа, пароли на хранилище и на ключ.
keytool -genkey
keytool -v -genkey -dname "CN=company.ru, OU=dept, O=company, L=city, C=BY" -alias father -storetype jks -keystore teststore.jks -validity 180 -keyalg RSA -keysize 2048 -storepass mystorepass -keypass mykeypass
* Ключи в хранилище - это хорошо. Но как достать данные из него? Для
этого полезен экспорт сертификата из хранилища. Первая команда выведет
сертификат в бинарном виде DER; вторая - то
же, но в base64-кодированном формате; ну, а третья создаст файл sert.crt
с base64-сертификатом (сам сертификат размещается между "-----BEGIN
CERTIFICATE-----" и "-----END CERTIFICATE-----").
keytool -v -exportcert -alias father -keystore store.jks
keytool -v -exportcert -alias father -keystore store.jks –rfc
keytool -v -exportcert -alias father -keystore store.jks -rfc -file sert.crt
* Файл сертификата получен, внутри - много символов, которые человеку
ничего не говорят. Просмотр файла сертификата поможет
извлечь информацию. Команда выведет на экран информацию о владельце
сертификата, срок действия, отпечатки сертификата и другие данные. Таким
же образом можно просмотреть не только созданный нами, но и любой
другой сертификат.
keytool -v -printcert -file sert.crt
* Если требуется просмотр сертификата непосредственно в хранилище или содержимого всего хранилища:
keytool -v -list -keystore store.jks -storepass mystorepass -alias father
keytool -v -list -keystore store.jks -storepass mystorepass
* Что можно сделать с файлом сертификата? Можно посмотреть сертификат в операционной системе, можно установить его в доверенные сертификаты браузера,
импортировать в другое хранилище как доверенный (об этом чуть позже).
Однако пока наш сертификат "самоподписанный", т. е. "мы его сделали, и
сами же его удостоверили, и обещаем, что он хорош". Однако на практике,
думается, многие не будут доверять такому сертификату (и правильно
сделают). Чтобы обеспечить доверие, надо подписать наш сертификат в
каком-нибудь CA - центре сертификации (thawte, verisign ипр.), которому все
доверяют. Для начала требует сгенерировать запрос на подпись сертификата
(certificate signing request, CSR). В результате выполнения будет
создан файл testcsr.csr, тот самый, который нужно будет передать в CA для подписи нашего сертификата.
keytool -v -certreq -alias father -keystore store.jks -file testcsr.csr -storepass mystorepass -keypass mykeypass
* Положим, мы прошли процедуру проверки нашего сертификата выбранным CA и
получили назад удостоверенный и подписанный сертификат. Теперь необходим импорт сертификата в хранилище. Но перед этим - что очень важно -
надо импортировать все доверенные сертификаты (корневые и промежуточные)
центра сертификации. Это необходимо для того, чтобы удалось построить
цепочку: наш сертификат подписан CA#1, в свою очередь тот подписан CA#2 и
т. д. до корневого CA, которому мы верим "на слово", потому что он
известен всем.
keytool -v -importcert -keystore store.jks -alias cacert-root -file cacert-root.crt
keytool -v -importcert -keystore store.jks -alias cacert-intm -file cacert-intermediate.crt
keytool -v -importcert -keystore store.jks -alias father -file testcsr-signed.crt
* Также могут оказаться полезными следующие команды:
- удаление сертификата из хранилища (например, он был отозван)
keytool -v -delete -alias mydomain -keystore keystore.jks
- изменение пароля на keystore-хранилище
keytool -storepasswd -storepass mystorepass -new mystorepass12 -keystore store.jks
- просмотр списка сертификатов доверенных центров CA
keytool -v -list -keystore $JAVA_HOME/jre/lib/security/cacerts
- импорт нового CA в стандартное хранилище доверенных сертификатов
keytool -import -trustcacerts -file /path/to/ca/ca.pem -alias CA_ALIAS -keystore $JAVA_HOME/jre/lib/security/cacerts
Другой инструментарий по теме
Полезные ссылки
"keytool - Key and Certificate Management Tool" - основная документации для чтения, jdk 5, jdk 6, jdk 7The Most Common Java Keytool Keystore Commands
Утилита keytool для управления JAVA-хранилищами сертификатов
A few frequently used SSL commands
Комментариев нет:
Отправить комментарий