вторник, 19 февраля 2013 г.

keytool: управление ключами и сертификатами

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


Другой инструментарий по теме
OpenSSLopen source криптографический пакет (см. также wiki).
KeyTool IUI, Portecle, KeyTool Advanced GUI – графические надстройки над keytool.


Полезные ссылки
"keytool - Key and Certificate Management Tool" - основная документации для чтения, jdk 5, jdk 6, jdk 7
The Most Common Java Keytool Keystore Commands
Утилита keytool для управления JAVA-хранилищами сертификатов
A few frequently used SSL commands

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

Отправить комментарий