Криптография в Java. Утилита Keytool
Привет, Хабр! Представляю вашему вниманию перевод 10 статьи «Java Keytool» автора Jakob Jenkov из серии статей для начинающих, желающих освоить основы криптографии в Java.
Оглавление:
Утилита Keytool
Java Keytool — это инструмент командной строки, который может генерировать пары открытый ключ / закрытый ключ и сохранять их в хранилище ключей. Исполняемый файл утилиты распространяется вместе с Java SDK (или JRE), поэтому, если у вас установлен SDK, значит она у вас также будет предустановлена.
Исполняемый файл называется keytool . Чтобы выполнить его, откройте командную строку (cmd, console, shell и т.д.). и измените текущий каталог на каталог bin в каталоге установки Java SDK. Введите keytool , а затем нажмите клавишу Enter . Вы должны увидеть что-то похожее на это:
C:\Program Files\Java\jdk1.8.0_111\bin>keytool Key and Certificate Management Tool Commands: -certreq Generates a certificate request -changealias Changes an entry's alias -delete Deletes an entry -exportcert Exports certificate -genkeypair Generates a key pair -genseckey Generates a secret key -gencert Generates certificate from a certificate request -importcert Imports a certificate or a certificate chain -importpass Imports a password -importkeystore Imports one or all entries from another keystore -keypasswd Changes the key password of an entry -list Lists entries in a keystore -printcert Prints the content of a certificate -printcertreq Prints the content of a certificate request -printcrl Prints the content of a CRL file -storepasswd Changes the store password of a keystore Use "keytool -command_name -help" for usage of command_name C:\Program Files\Java\jdk1.8.0_111\bin>
Как видите, утилита keytool поддерживает набор команд для работы с ключами, сертификатами и хранилищами ключей. В этом руководстве будут рассмотрены наиболее часто используемые из этих команд.
Скрипты Keytool
Команды утилиты Keytool принимают много аргументов, правильность установки которых может быть трудно запомнить. Поэтому рекомендуется создать несколько скриптов CMD или Shell с последовательностью команд Keytool . Эти сценарии упрощают повторное выполнение команд, а также позволяют вернуться назад и посмотреть, как было создано хранилище ключей.
Генерация ключевой пары
Генерация ключевой пары (открытый ключ / закрытый ключ) является одной из наиболее распространенных задач, для которых используется утилита Keytool . Сгенерированная пара ключей вставляется в файл KeyStore как пара ключей с собственной подписью. Вот общий формат командной строки для генерации пары ключей:
-genkeypair -alias alias -keyalg keyalg -keysize keysize -sigalg sigalg -dname dname -keypass keypass -validity valDays -storetype storetype -keystore keystore -storepass storepass -providerClass provider_class_name -providerArg provider_arg -v -protected -Jjavaoption
Аргументы объяснены в разделе Аргументы Keytool. Не все эти аргументы нужны и многие являются не обязательными. Утилита сообщит вам, если вы пропустили обязательный аргумент. Вот пример команды, которая импортирует сертификат в KeyStore. Не забудьте удалить разрывы строк при вводе команды в командной строке.
"C:\\Program Files\Java\jdk1.8.0_111\bin\keytool" -importcert -alias testkey -keypass 123456 -storetype JKS -keystore keystore2.jks -file cert.cert -rfc -storepass abcdef
Список записей хранилища
Чтобы вывести список записей в хранилище ключей, вы можете использовать команду list . Ниже представлен формат для команды list . Разрывы строк предназначены только для упрощения чтения. Удалите разрывы строк перед выполнением команды:
-list -alias alias -storetype storetype -keystore keystore -storepass storepass -providerName provider_name -providerClass provider_class_name -providerArg provider_arg -v -rfc -protected -Jjavaoption
Вот пример команды list . Не забудьте удалить разрывы строк!
"C:\\Program Files\Java\jdk1.8.0_111\bin\keytool" -list -storetype JKS -keystore keystore.jks -storepass abcdef
Эта команда выведет список всех записей в данном хранилище ключей. Результат выполнения будет выглядеть примерно так:
Keystore type: JKS Keystore provider: SUN Your keystore contains 1 entry testkey, 19-Dec-2017, PrivateKeyEntry, Certificate fingerprint (SHA1): 4F:4C:E2:C5:DA:36:E6:A9:93:6F:10:36:9E:E5:E8:5A:6E:F2:11:16
Если вы включите аргумент alias в команду list , в список попадет только запись, соответствующая данному псевдониму. Вот пример команды list с аргументом alias :
"C:\\Program Files\Java\jdk1.8.0_111\bin\keytool" -list -alias testkey -storetype JKS -keystore keystore.jks -storepass abcdef
Результат выполнения вышеупомянутой команды:
testkey, 15-Dec-2017, PrivateKeyEntry, Certificate fingerprint (SHA1): 71:B0:6E:F1:E9:5A:E7:F5:5E:78:71:DC:08:80:47:E9:5F:F8:6D:25
Удаление записи хранилища ключей
Так же в в утилите keytool имеется команда, которая может удалить запись из хранилища ключей: delete . Вот формат этой команды:
-delete -alias alias -storetype storetype -keystore keystore -storepass storepass -providerName provider_name -providerClass provider_class_name -providerArg provider_arg -v -protected -Jjavaoption
Вот пример вызова команды delete . Не забудьте удалить разрывы строк перед запуском!
"C:\\Program Files\Java\jdk1.8.0_111\bin\keytool" -delete -alias testkey -storetype JKS -keystore keystore.jks -storepass abcdef
Эта команда удаляет запись хранилища с псевдонимом testkey хранящегося в файле keystore.jks .
Генерация запроса на сертификат
Утилита keytool может генерировать запрос сертификата с помощью команды certreq . Запрос сертификата — это запрос к центру сертификации (ЦС) на создание публичного сертификата для вашей организации. После создания запроса на сертификат он должен быть отправлен в центр сертификации, в котором вы хотите создать сертификат (например, Verisign, Thawte или какой-либо другой центр сертификации). Прежде чем вы сможете сгенерировать запрос сертификата для личного ключа и пары открытых ключей, вы должны сгенерировать этот закрытый ключ и пару открытых ключей в хранилище ключей (или импортировать его). Как это сделать можно посмотреть в соответсвтующей главе. Вот формат команды для генерации запроса сертификата. Не забудьте удалить все разрывы строк при использовании этой команды:
-certreq -alias alias -sigalg sigalg -file certreq_file -keypass keypass -storetype storetype -keystore keystore -storepass storepass -providerName provider_name -providerClass provider_class_name -providerArg provider_arg -v -protected -Jjavaoption
Вот пример команды -certreq :
"C:\\Program Files\Java\jdk1.8.0_111\bin\keytool" -certreq -alias testkey -keypass 123456 -storetype JKS -keystore keystore.jks -storepass abcdef -file certreq.certreq
Эта команда сгенерирует запрос сертификата для ключа, сохраненного с псевдонимом testkey в файле keystore.jks , и запишет запрос сертификата в файл с именем certreq.certreq .
Аргументы утилиты keytool
Ниже приведен список аргументов, которые принимают различные команды keytool . Помните, что не все команды принимают все эти аргументы. Посмотрите на конкретную команду, чтобы увидеть, какие аргументы она принимает.
- -alias Псевдоним записи в хранилище ключей. Помните, псевдоним
может указывать только на один ключ. - -keyalg Название алгоритма, используемого для генерации ключа. Обычно используется RSA.
- -keysize Размер ключа в битах. Обычно размеры ключа кратны. Кроме того, различные алгоритмы могут поддерживать только определенные предварительно заданные размеры ключей.
- -sigalg Алгоритм подписи, используемый для подписи пары ключей.
- -dname Уникальное имя из стандарта X.500. Это имя будет связано с
псевдонимом для этой пары ключей в хранилище ключей, также
используется в качестве полей «эмитент» и «субъект» в самозаверяющем
сертификате. - -keypass Пароль ключевой пары, необходимый для
доступа к этой конкретной паре ключей в хранилище ключей. - -validity Количество дней, в течение которых сертификат,
приложенный к паре ключей, должен быть действительным. - -storetype Формат файла, в котором должно быть сохранено хранилище ключей. По умолчанию используется JKS. Другим вариантом является формат PKCS11.
- -keystore Имя файла хранилища для хранения сгенерированной пары
ключей. Если файл не существует, он будет создан. - -file Имя файла для чтения или записи сертификата или запроса сертификата.
- -storepass Пароль от хранилища ключей, всем, кто захочет работать
с ним, понадобится этот пароль. Отличие storepass от keypass в
том что первый предоставляет доступ к хранилищу, а второй к отдельной
паре ключей. Вам понадобятся оба пароля для доступа к любому ключу,
хранящемуся в хранилище. - -rfc Если включить этот флаг, то утилита будет использовать текстовый формат, а не двоичный формат, например для экспорта или импорта сертификатов. Значение -rfc
относится к стандарту RFC 1421. - -providerName Имя провайдера криптографического API, который вы хотите использовать при создании пары ключей. Имя провайдера должно быть указано в файлах свойств безопасности Java.
- -providerClass Имя корневого класса провайдера криптографического API, который вы хотите использовать. Используется когда имя провайдера не указано в файлах свойств безопасности Java.
- -providerArg Аргументы, передаваемые собственному криптографическому провайдеру при инициализации (если это необходимо провайдеру).
- -v Сокращенное от verbose, утилита Keytool будет выводить много дополнительной информации в командную строку в удобочитаемом формате.
- -protected Определяет, должен ли пароль хранилища ключей предоставляться каким-либо внешним механизмом, например, аппаратный токен. Допустимые значения: true и false.
- -Jjavaoption Строка опций для Java VM которая генерирует пару ключей и создает хранилище.