Pull to refresh

Криптография в Java. Утилита Keytool

Reading time 6 min
Views 50K
Original author: Jakob Jenkov

Привет, Хабр! Представляю вашему вниманию перевод 10 статьи "Java Keytool" автора Jakob Jenkov из серии статей для начинающих, желающих освоить основы криптографии в Java.


Оглавление:


  1. Java Cryptography
  2. Java Cipher
  3. MessageDigest
  4. Mac
  5. Signature
  6. KeyPair
  7. KeyGenerator
  8. KeyPairGenerator
  9. KeyStore
  10. Keytool
  11. Certificate
  12. CertificateFactory
  13. 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 которая генерирует пару ключей и создает хранилище.
Tags:
Hubs:
+6
Comments 0
Comments Leave a comment

Articles