Привет, Хабр! Представляю вашему вниманию перевод 10 статьи "Java Keytool" автора Jakob Jenkov из серии статей для начинающих, желающих освоить основы криптографии в Java.
Оглавление:
- Java Cryptography
 - Java Cipher
 - MessageDigest
 - Mac
 - Signature
 - KeyPair
 - KeyGenerator
 - KeyPairGenerator
 - KeyStore
 - Keytool
 - Certificate
 - CertificateFactory
 - CertPath
 
Утилита 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 которая генерирует пару ключей и создает хранилище.