Keytool и примеры использования с параметрами

Обновлено 26.09.2023

java logoДобрый день! Уважаемые читатели и гости IT Блога Pyatilistnik.org. В прошлый раз мы с вами разобрали полезную утилиту для системного администратора Remote Desktop Connection Manager, многие открыли для себя простоту и функциональность ее использования. Сегодня я хочу вас познакомить с еще одним, полезным инструментом, который поможет вам удобно управлять ключами и сертификатами в вашей системе. Речь пойдет про утилиту keytool, мы рассмотрим примеры ее использования на реальных ситуациях.

Что такое Keytool ?

Keytool - это утилита командной строки, для управления ключами или сертификатами, а так же хранилищами ключей. Она позволяет пользователям управлять своими собственными парами открытых и закрытых ключей и связанными сертификатами для использования при аутентификации, где от пользователя, это требует конечный сервис или службах целостности данных и аутентификации с использованием цифровых подписей. Keytool также позволяет пользователям администрировать секретные ключи, используемые при симметричном шифровании/дешифровании (например, DES). Пользователь имеет возможность самостоятельно генерировать эти пары ключей, после чего он их сохраняет в хранилище ключей (keystore).

Keystore - это защищенный файл или правильнее сказать база данных, которая выступает в роли специального, защищенного хранилища открытых ключей, сертификатов, секретных ключей.

Закрытый и открытый ключи используются в асимметричном шифровании. Открытый ключ может иметь связанный сертификат. Сертификат - это цифровой документ, удостоверяющий личность человека, организации или устройства, претендующего на владение открытым ключом. Сертификат обычно имеет цифровую подпись проверяющей стороны в качестве доказательства (Удостоверяющие центры).

Секретные ключи используются в симметричном шифровании. Во многих случаях симметричные ключи согласовываются при настройке безопасного соединения. Поэтому вы будете чаще хранить открытые и закрытые ключи, KeyStore чем секретные ключи.

Все это многообразие используется приложениями Java для:

Keystore умеет работать в ситуации, когда в процессе работы необходима аутентификация сервера и клиента, где все реализовано с помощью SSL соединения, подразумевающее использование приватных ключей и сертификатов и так же keystore применяется при односторонней аутентификации, но только на стороне сервера. Java KeyStore представлен классом java.security.KeyStore. Поскольку KeyStore общедоступен, пользователи JDK могут создавать дополнительные приложения безопасности, которые его используют.

Типы поддерживаемых форматов в keystore

  • pkcs12 - это один из типов хранилища, заточенный чисто под хранение и перенос закрытых ключей пользователя, сертификатов.
  • jceks - сторонняя разработка хранилища, отличная более стойким шифрованием на основе triple DES. Позволяет обновлять существующие jks-хранилища до jceks
  • jks - это самый обычный, стандартный тип хранилища, в виде простого файла имеющего расширение jks ("java key storage"), устанавливается по умолчанию и, поэтому, применяется наиболее часто.

Реализации Keystore основаны на провайдере. Более конкретно, интерфейсы приложений, предоставляемые KeyStore, реализованы в терминах "Интерфейс поставщика услуг" (Service Provider Interface - SPI). То есть существует соответствующий абстрактный класс KeystoreSpi, также в пакете java.security, который определяет методы интерфейса поставщика услуг, которые должны реализовывать " провайдеры-поставщики". (Термин «поставщик» относится к пакету или набору пакетов, которые предоставляют конкретную реализацию подмножества служб, к которым может обращаться API безопасности Java.)

Приложения могут выбирать различные типы реализаций хранилища ключей от разных поставщиков, используя фабричный метод getInstance, предоставленный в классе KeyStore . Тип хранилища ключей определяет хранилище и формат данных информации хранилища ключей, а также алгоритмы, используемые для защиты личных ключей в хранилище ключей и целостности самого хранилища ключей. Реализации Keystore разных типов несовместимы. keytool работает с любой файловой реализацией хранилища ключей. (Он обрабатывает расположение хранилища ключей, которое ему передается в командной строке, как имя файла и преобразует его в FileInputStream, из которого он загружает информацию о хранилище ключей.) Инструменты jarsigner и policytool, с другой стороны, могут читать хранилище ключей из любого места, которое можно указать с помощью URL.

Если вы не укажете явно тип хранилища ключей, инструменты выберут реализацию хранилища ключей просто на основании значения свойства keystore.type, указанного в файле свойств безопасности. Файл свойств безопасности называется java.security и находится в каталоге свойств безопасности JDK, java.home/lib/security. Каждый инструмент получает значение keystore.type, а затем проверяет все установленные на данный момент провайдеры, пока не найдет того, который реализует хранилища ключей этого типа. Затем он использует реализацию хранилища ключей от этого провайдера.

Где хранится Keystore и что такое алиас

Любая созданная запись в хранилище ключей Keystore может иметь уникальный псевдоним (алиас - alias). В документации, настоятельно рекомендуется называть алиасы записей Keystore другими именами, отличными от основных. Простой пример, допустим, у вас запись называется root.pyatilistnik.org, вы можете задать алиас 5org. В стандартной реализации каждый ключ в хранилище защищается паролем; кроме того, всё хранилище целиком может быть защищено отдельным паролем. Если вы ничего не меняли, то стандартное расположение хранилища сертификатов находится по пути  jre/lib/security/cacerts (пароль по умолчанию- changeit).

Где скачать утилиту keytool

Утилита Keytool входит в состав Java SDK (или JRE), в большинстве компьютеров в основном установлена JRE версия. В Windows данную утилиту можно найти по пути:

C:\Program Files (x86)\Java\jre1.8.0_201\bin\

или

C:\Program Files\Java\jre1.8.0_201\bin\

Тут все зависит от разрядности Java. На скриншоте отмечен файл Keytool.exe.

скачать Keytool

Как запустить утилиту Keytool в Windows

Сейчас я вам расскажу, как вы можете запускать утилиту Keytool в операционных системах Windows. Откройте командную строку в режиме администратора. Далее выполните вот такую команду, чтобы перейти в расположение утилиты:

cd C:\Program Files (x86)\Java\jre1.8.0_201\bin\ или cd  C:\Program Files\Java\jre1.8.0_201\bin\ (Хочу отметить, что у вас будет своя версия отличная моей jre1.8.0_201)

запуск Keytool в Windows

Далее вы просто пишите keytool.exe и нажимаете Enter, в результате чего вы увидите справку по утилите.

запуск Keytool в Windows-2

Так же утилиту keytool.exe вы можете запускать и в оболочке PowerShell. Откройте ее от имени администратора или другого пользователя с аналогичными правами. Для этого в оболочке введите:

cd "C:\Program Files (x86)\Java\jre1.8.0_201\bin"

После чего введите .\keytool.exe

Открыть keytool.exe в powershell

Команды и примеры использования утилиты Keytool

  • Получение справки по утилите Keytool. Первое, что я хочу, чтобы вы научились, это использование справки, чтобы представлять, как строится конструкция команд и их возможности. Вводим просто Keytool, у вас появятся основные ключи, которые покажут, что вы можете делать через утилиту

C:\Program Files (x86)\Java\jre1.8.0_201\bin>keytool.exe
Key and Certificate Management Tool

Список команд

-certreq - генерация CSR запроса
-changealias - изменить запись алиаса
-delete  - удалить запись
-exportcert - экспортировать сертификат
-genkeypair - генерация пары ключей
-genseckey - генерация секретного ключа
-gencert - генерация сертификата из csr запроса
-importcert - импорт сертификата или цепочки
-importpass - импорт паролей
-importkeystore - импорт одной или нескольких записей из другого Keystore
-keypasswd - изменить пароль у записи
-list - список всех записей в хранилище сертификатов
-printcert - вывод содержимого сертификата
-printcertreq - вывод содержимого CSR запроса
-printcrl - вывод содержимого CRL запроса
-storepasswd - изменить пароль на Keystore

Справка по утилите Keytool

Далее, чтобы получить дополнительные ключи по командам из первого списка, вам необходимо добавить ключ -help. Например, я хочу понять как строится команда по генерации пары ключей, для этого я пишу:

keytool.exe -genkeypair -help и получаю вывод дополнительных ключей:

-alias <alias> alias name of the entry to process
-keyalg <keyalg> key algorithm name
-keysize <keysize> key bit size
-sigalg <sigalg> signature algorithm name
-destalias <destalias> destination alias
-dname <dname> distinguished name
-startdate <startdate> certificate validity start date/time
-ext <value> X.509 extension
-validity <valDays> validity number of days
-keypass <arg> key password
-keystore <keystore> keystore name
-storepass <arg> keystore password
-storetype <storetype> keystore type
-providername <providername> provider name
-providerclass <providerclass> provider class name
-providerarg <arg> provider argument
-providerpath <pathlist> provider classpath
-v verbose output
-protected password through protected mechanism

Дополнительная справка в Keytool

  • Создание самоподписного сертификата и файла хранилища сертификатов. Наверняка, это самый популярный сценарий, для чего используется утилита Keytool. Чтобы сгенерировать пару ключей в новом Keystore или уже существующем, вам необходимо выполнить:

keytool -genkey -alias pyatilistnik.org -keypass 12345678 -keyalg RSA -validity 730 -keystore keystore.jks -keysize 2048

В результате выполнения данной команды, у вас будет создан самоподписный сертификат, сроком на два года (730 дней), ключи будут RSA в виде 2048 бит, с псевдонимом pyatilistnik.org. Располагаться они будут в хранилище ключей с именем keystore.jks, если файла нет ,то он будет создан автоматически. Закрытый ключ будет защищен паролем установленным в ключе -keypass, в данном примере 12345678. Открытый ключ, это и будет самоподписанный сертификат. Советую вам самим устанавливать все параметры, в противном случае при генерации вы будите отвечать на дополнительные вопросы, и если вы все оставите по умолчанию, то например параметры по умолчанию для алиаса будут mykey, или алгоритм шифрования SHA1withDSA.

Во время генерации вам необходимо заполнить следующую информацию:

  • What is your first and last name - Сюда можно записать адрес сайта
  • What is the name of your organizational unit? - Как называется ваша организационная единица, можно указать название организации
  • What is the name of your organization? - имя вашей организации
  • What is the name of your City or Locality? - Географическое расположение
  • What is the name of your State or Province? - штат или область
  • What is the two-letter country code for this unit? - Страна, заполняется в виде двух букв в международном стандарте
  • Distinguished Name -  тут просто пишем Yes

В результате чего у вас будет сгенерирован ваш сертификат, и если файла keystore.jks не было, то он будет создан.

Генерация ключа в Keytool

  • Создание стандартного хранилища сертификатов отдельной командой:

KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());

  • Создание хранилища формата PKCS12

KeyStore keyStore = KeyStore.getInstance("PKCS12");

  • Создание пары ключей, напоминаю, что за это отвечает ключ genkeypair.

keytool -genkeypair -alias root.pyatilistnik.org -keypass 12345678 -keysize 2048 -keyalg RSA -keystore keystore.jks  -dname "CN=root.pyatilistnik.org"

В результате я получаю генерацию пары ключей с алиасом root.pyatilistnik.org. Открытый ключ обертывается в формат X.509 — это самоподписанный сертификат, который сохранен как одноэлементная цепочка сертификата, -keypass задает пароль 12345678, -keyalg задает алгоритм генерации пары ключей, -keysize задает размер ключей, -keystore определяет используемое хранилище сертификатов,-dname задает отличительное имя в формате X.500, связанное с псевдонимом и используемое в качестве issuer и subject поля в самоподписанном сертификате.

Создание пары ключей Keytool

  • Для того. чтобы посмотреть содержимое вашего хранилища сертификатов, вам необходимо выполнить команду:

keytool.exe -list -keystore keystore.jks

Тут мы запросили список записей в файле keystore.jks, на выходе получили вот такой вывод. Как видно в моем примере их две.

просмотр записей в keystore.jks

  • Можно посмотреть определенный алиас, через такую конструкцию:

keytool.exe -list -alias pyatilistnik.org -keystore keystore.jks

  • Генерация CSR запроса, о том, что это такое читайте по ссылке слева.Тут все просто:

keytool -certreq -alias pyatilistnik.org -keystore keystore.jks -file pyatilistnik.org.csr

csr в Keytool

В итоге у меня появился файл pyatilistnik.org.csr, который если открыть файловым редактором, будет содержать вот такую запись.

Содержимое csr запроса

Кстати сгенерировать CSR запрос на основе утилиты Keytool вы можете и на сайте, коих много, вот пример такого https://www.digicert.com/easy-csr/keytool.htm. Заполняете поля и нажимаете соответствующую кнопку.

GUI csr в Keytool

  • Экспорт сертификатов из хранилища, осуществляется вот так (Будет экспортирован открытый ключ с расширением cer):

keytool -exportcert -alias pyatilistnik.org -keystore keystore.jks -file pyatilistnik.cer

Экспорт сертификата в keytool

  • Удаление сертификата (алиаса) из хранилища keystore. Предположим, что я хочу удалить запись с алиасом pyatilistnik.org, для этого:

keytool -delete -alias pyatilistnik.org -storetype JKS -keystore keystore.jks

В итоге -delete - это команда на удаление, -alias имя алиаса pyatilistnik.org, -storetype тип хранилища JKS, -keystore файл хранилища keystore.jks. Перед выполнением я вывел список текущих записей, в его составе 3 записи. После удаления их осталось две, без той, что я удалил.

Удаление сертификата в keytool

  • Импорт сертификатов через keytool. Ранее я экспортировал сертификат, и у меня остался файл pyatilistnik.cer, его я и помещу в свое хранилище keystore.jks. Для этого:

keytool -importcert -keystore keystore.jks -file pyatilistnik.cer

  • Импорт промежуточного сертификата CA в существующее хранилище Java ключей

keytool -import -trustcacerts -alias intermediate -file intermediate.crt -keystore keystore.jks

  • Импорт корневого сертификата CA в существующее хранилище Java ключей

keytool -import -trustcacerts -alias root -file root.crt -keystore keystore.jks

  • Импорт подписанного первичного сертификата SSL в существующее хранилище Java ключей, ключ -trustcacerts добавит сертификат в доверенные

keytool -import -trustcacerts -alias mydomain -file mydomain.crt -keystore keystore.jks

При импорте нового доверенного сертификата псевдоним не должен существовать в хранилище ключей. Перед добавлением сертификата в хранилище ключей keytool пытается проверить это, пытаясь построить цепочку доверия от этого сертификата до самозаверяющегося сертификата (принадлежащего корневому ЦС), используя доверенные сертификаты, которые уже доступны в хранилище ключей. Если была указана опция -trustcacerts, для цепочки доверия рассматриваются дополнительные сертификаты, а именно сертификаты в файле с именем cacerts. 

Если keytool не может проверить доверие от импортируемого сертификата до самозаверяющего сертификата (либо из хранилища ключей, либо из файла «cacerts»), информация о сертификате распечатывается, и пользователю предлагается проверить его, например, путем сравнения отображенных отпечатков сертификатов с отпечатками, полученными из какого-либо другого (доверенного) источника информации, которым может быть сам владелец сертификата. Будьте очень осторожны, чтобы убедиться, что сертификат действителен, прежде чем импортировать его как «доверенный» сертификат!

Файл сертификатов с именем «cacerts» находится в каталоге свойств безопасности, java.home/lib/security, где java.home - это каталог среды выполнения (каталог jre в SDK или каталог верхнего уровня среды выполнения Java 2). Файл «cacerts» представляет общесистемное хранилище ключей с сертификатами CA. Системные администраторы могут настроить этот файл и управлять им с помощью keytool, указав «jks» в качестве типа хранилища ключей. Файл хранилища ключей «cacerts» поставляется с несколькими сертификатами корневого CA со следующими псевдонимами и отличительными именами владельца X.500. Исходный пароль файла хранилища ключей "cacerts" - "changeit". Системные администраторы должны изменить этот пароль и разрешение доступа по умолчанию для этого файла после установки SDK.

Файл cacerts должен содержать только сертификаты доверенных центров сертификации. Вы несете ответственность за проверку сертификатов доверенного корневого CA, включенных в файл cacerts, и принятие собственных решений о доверии. Чтобы удалить ненадежный сертификат CA из файла cacerts, используйте опцию delete команды keytool. Вы можете найти файл Cacerts в каталоге установки JRE. Если посмотреть список того, что уже есть по умолчанию в данном файле, то вы увидите 94 записи, но может быть и больше.

Список сертификатов в cacerts

  • Как изменить тип хранилища сертификатов с PFX на JKS

keytool -importkeystore -srckeystore mypfxfile.pfx -srcstoretype pkcs12 -destkeystore newjkskeystore.jks -deststoretype JKS

  • Как преобразовать LKS хранилище в PFX

keytool -importkeystore -srckeystore myjksfile.jks -srcstoretype JKS -deststoretype PKCS12 -destkeystore newpfxkeystore.pfx

  • Подробная информация, о вашем хранилище

keytool -list -v -keystore keystore.jks

подробная информация о хранилище keystore.jks

  • Как поменять пароль на хранилище keystore.jks, для этого:

keytool -storepasswd -new 123456 -keystore keystore.jks

Смена пароля keystore.jks

  • Как поменять псевдоним

keytool -changealias -alias pyatilistnik.org -destalias new.pyatilistnik.org -keystore keystore.jks

Если у вас в командной строке выдается, что keytool не является внутренней или внешней командой, то просто установите Java

Графические аналоги утилиты keytool

Существуют утилиты с графическим интерфейсом, которые полностью имеют такой же или больший функционал, чем keytool. Для примера хочу привести утилиту Key Store Explorer 5. Утилита бесплатная, можете скачать Key Store Explorer 5.41 у меня. После установки утилиты, ваши файлы хранилищ сертификатов, станут автоматически через нее открываться при двойном клике.

Использование Key Store Explorer 5

Открываю файл keystore.jks через Key Store Explorer 5, как видите утилита просит пароль от хранилища, вводим его.

Key Store Explorer 5

Попав в ваше хранилище, вы сразу увидите список ваших сертификатов с псевдонимами. Два раза по нему кликнув вы попадете в него, где сможете увидеть:

  • CN
  • Серийный номер сертификата
  • Дату выпуска и срок его окончания
  • Можете посмотреть закрытый ключ
  • Экспортировать открытый ключ, при чем в разных форматах, например в PEM.

Операции с сертификатами в Key Store Explorer 5

Через правый клик вы можете увидеть ряд дополнительных операций с вашим сертификатом:

  • Генерация CSR
  • Экспорт
  • Импорт цепочки CA
  • Сменить пароль
  • Переименовать
  • Удалить

Действия с сертификатами в Key Store Explorer 5

В пункте "View Details" вы можете посмотреть ваш открытый ключ и закрытый.

Просмотр закрытого ключа

Открыв закрытый ключ вы легко можете его экспортировать через Key Store Explorer 5.

Выгрузка закрытого ключа

Новое хранилище создается через соответствующую кнопку, у вас появится на выбор его типы

Создание хранилища в Key Store Explorer 5

Аналогично вы можете создать в Key Store Explorer 5 и пары ключей.

Создание пары ключей в Key Store Explorer 5

У вас откроется дополнительное окно с настройками пары ключей, тут вы можете выбрать версию ключей, срок действия, серийный номер

Создание новой пары ключей в Key Store Explorer 5-01

Можете выбрать алгоритм, если вас не устраивает стандартный SHA-256

Создание новой пары ключей в Key Store Explorer 5-02

Через кнопку изменения имени, вы можете настроить абсолютно все поля

Создание новой пары ключей в Key Store Explorer 5-03

При желании вы можете не использовать в утилите Key Store Explorer 5cacerts, а использовать Windows хранилище доверенных корневых сертификатов. Для этого в настройках установите галку "Use Windows Trusted Root Certificates".

Использование windows хранилища в Key Store Explorer 5

По мимо утилиты Key Store Explorer 5 есть еще куча, например DigiCert Certificate Utility, но так как статья получилась и так большой, я не стал ее тут описывать, принцип у нее такой же. Думаю, что вы сегодня разобрались с утилитой keytool и ее аналогами. На этом у меня все ,с вами был Иван Семин, автор и создатель IT блога Pyatilistnik.org.

Автор - Сёмин Иван

3 Responses to Keytool и примеры использования с параметрами

  1. Наталья:

    Спасибо! Очень помогло!

  2. Алексей:

    Спасибо! Очень подробная и понятная статья!

  3. Иван Семин:

    Добрый день! Рад, что смог вам помочь.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *