Trusted java ключ
Хранилище ключей и сертификатов
Защита данных в приложениях имеет важное значение, защита конфиденциальной информации — первостепенное. Одним из самых распространённых способов защиты информации во все времена является шифрование данных. Криптография, симметричное и асимметричное шифрование, ключи и сертификаты непосредственно связаны с данной задачей. Используемые для защиты информации ключи и сертификаты также нужно надежно защитить. Для этих целей используется keystore — хранилище сертификатов и ключей.
keystore — это специализированное хранилище секретных данных, которое используется Java-приложениями для шифрования, аутентификации и установки HTTPS соединений. Так, для аутентификации клиента и сервера, устанавливающих SSL (Secure Sockets Layer — уровень защищённых cокетов) соединение, требуются приватные ключи и сертификаты. Если используется односторонняя аутентификация, то keystore используется только на серверной стороне. При двусторонней аутентификации клиент и сервер обмениваются сертификатами; соответственно и у сервера, и у клиента должны быть keystore с парой ключей private/public + сертификат. Иными словами keystore используется для хранения ключей и сертификатов, применяемых для идентификации владельца ключа (клиента или сервера).
Java поддерживает несколько форматов хранилищ keystore :
• jks | — стандартный тип хранилища в виде файла с расширением jks («java key storage»); устанавливается по умолчанию и, поэтому, применяется наиболее часто. |
• jceks | — альтернативная реализация хранилища, которая использует более сильное шифрование на основе triple DES; можно обновить имеющееся jks-хранилище до jceks соответствующей командой утилиты keytool. |
• pkcs12 | — тип хранилища, предназначенный прежде всего для хранения или переноса закрытых ключей пользователя, сертификатов и пр. |
Каждая запись в keystore имеет уникальный псевдоним (alias). Рекомендуется в keystore не использовать alias’ы, отличающиеся только регистром. В стандартной реализации каждый ключ в хранилище защищается паролем; кроме того, всё хранилище целиком может быть защищено отдельным паролем.
Стандартное хранилище доверенных CA-сертификатов (Certificate Authority) для Java приложений располагается в директории jre/lib/security/cacerts (пароль — changeit).
Информацию в хранилище можно разделить на две категории: ключевые записи (пары ключей private/public) и доверенные сертификаты. Ключевая запись, используемая для криптографических целей, включает идентификационные данные объекта и его закрытый ключ. Доверенный сертификат содержит идентификационные данные объекта и открытый ключ. Запись с доверенным сертификатом не может использоваться в тех случаях, где требуется закрытый ключ.
Чтобы отделить ключевые записи от сертификатов целесообразно использовать различные хранилища : один для собственных ключей, а другой — для доверенных сертификатов, включая сертификаты Центров сертификации (CA). Такой подход позволит реализовать разделение между собственными сертификатами и соответствующими закрытыми ключами, и доверенными сертификатами. Дополнительно можно обеспечить более высокую защиту для закрытых ключей в отдельном keystore с ограниченным доступом, а доверенные сертификаты оставить в более свободном доступе.
В конце статьи представлен Java пример просмотра содерживого хранилища ключей и сертификатов CertificateReader.
Утилита keytool
Для управления парами ключей (private/public), сертификатами и хранилищем keystore Java включает утилиту keytool, располагаемую в директории bin. Для запуска keytool можно использовать командную строку. Опции утилиты позволяют выполнять различные операции и получать определенные сведения. Так, чтобы получить информацию об утилите, можно просто выполнить команду keytool без опций :
Чтобы получить дополнительную справку о команде необходимо указать ее наименование и волшебное слово help. Не забывайте о дефисе ‘-‘ перед опциями :
Создание самоподписанного сертификата
Для создания самоподписанного сертификата также необходимо использовать команду -genkey с указанием срока действия сертификата в опции -val >Закрытый ключ в хранилище «закрывается» паролем, открытый ключ «оборачивается» в самоподписанный сертификат .
Если заданного хранилища ключей (keystore.jks) не существует, то keytool создаст его. При выполнении команды keytool будет запрашивать некоторые необходимые данные : пароль хранилища, Distinguished Name и пароль закрытого ключа. Многие параметры используются со значениями по умолчанию. Так, например, алиас — mykey, хранилище — .keystore в домашней директории пользователя (HOMEPATH), алгоритм шифрвания — SHA1withDSA и пр.
Distinquished Name
Сертификат создается в формате X.509. В этом формате в качестве идентификатора владельца используется Distinquished Name или просто DN в формате X.500. Этот же формат идентификации объектов используется в LDAP-протоколе или в SNMP. Distinquished Name задается в виде разделенных через запятую атрибутов :
- CN — common name (имя владельца);
- OU — organizational unit or department/division (департамент/отдел);
- O — organization name (наименование организации);
- L — locality or city (город/местоположение);
- ST — state or province;
- C — country, two chars (страна).
Часть из атрибутов могут быть пропущены; в этом случае им будет присвоено значение Unknown.
Одним из важных атрибутов сертификата являются альтернативные имена SAN (SubjectAlternativeName). Подробности и пример внесения SAN в самоподписанный сертификат представлены на странице настройки конфигурации сервера Tomcat.
Параметры сертификата можно указывать в качестве опции команды. Так, в следующем варианте примера задаётся информация о компании, наименование алиаса, тип и размещение хранилища, срок действия, алгоритм для генерации ключей, размер ключа, пароли на хранилище и на ключ.
Новое хранилище было размещено в той же директории, где и располагается keytool.
Создание пары ключей
Для создания пары ключей необходимо использовать команду «-genkeypair». Следующая команда создаст пару ключей «keypair» в хранилище keystore.jks, где размещен созданный ранее сертификат.
Сертификат и закрытый ключ сохранены в виде новой keystore записи, идентифицированной псевдонимом «keypair». Открытый ключ обертывается в формат X.509 — это самоподписанный сертификат, который сохранен как одноэлементная цепочка сертификата.
Опции команды genkeypair
- [-storepass storepass]
- [-keypass keypass] — является паролем, используемым для защиты закрытого ключа
- [-dname dname] — определяет отличительное имя в формате X.500, связанное с псевдонимом и используемое в качестве issuer и subject поля в самоподписанном сертификате
- <-keyalg keyalg>— определяет алгоритм, который будет использоваться, чтобы генерировать пару ключей
- <-keysize keysize>— определяет размер каждого ключа, который будет сгенерирован
- <-sigalg sigalg>— определяет алгоритм, который должен использоваться, чтобы подписать самоподписанный сертификат; алгоритм должен быть совместимым с keyalg
- <-ext ext>*
- <-providerClass provider_class_name <-providerArg provider_arg>>
Создадим еще две пары ключей с псевдонимами «keypair1» и «keypair2», чтобы при просмотре содержимого хранилища (ниже) был небольшой список пар ключей :
Экспорт сертификата
Сертификат можно экспортировать из хранилища и предоставить его пользователям Вашей «подписанной» программы. Тогда пользователи могут занести Ваш сертификат в свое хранилище доверенных сертификатов. Для экспорта сертификата используется команда «exportcert». Следующий пример извлекает из хранилища сертификат в файл «parent.cer» :
Импорт сертификата
Чтобы импортировать сертификат в хранилище, нужно его сначала получить каким-либо образом. Не будем мудрить и извлечем сертификат с псевдонимом veriSignclass1g3ca из хранилища доверенных сертификатов jrelibsecuritycacerts (пароль хранилища changeit). То есть выполним команду экспорта сертификата с указанием соответствующего хранилища :
Экспорт сертификата из хранилища cacerts
Импорт сертификата в хранилище
Чтобы импортировать сертификат в хранилище keystore.jks необходимо использовать команду «importcert». Если в качестве опции указать «-trustcacerts», то сертификат импортируется в хранилище доверенных сертификатов, т.е. в jrelibsecuritycacerts. При выполнении команды импорта утилита keytool попросит ввести пароль хранилища :
Просмотр хранилища
Для чтения содержимого хранилища необходимо использовать команду «-list». В качестве опции «-keystore» можно указать путь к хранилищу. По умолчанию команда «-list» отображает цифровой отпечаток SHA1 сертификата. Следующий код позволяет просмотреть содержимое созданного хранилища, включающего сертификат и три пары ключей :
Опции команды list
- [-storepass storepass]
- <-providerClass provider_class_name <-providerArg provider_arg>>
Если при просмотре хранилища использовать опцию «-v», то информация о сертификате выводится с дополнительной информацией, включающей владельца, порядковый номер и т.д. При использовании опции «-rfc» содержание сертификата печатается согласно интернет-стандарта RFC-1421.
На странице описания SSL сертификата представлен результат выполнения команды просмотра хранилища keytool -list для опций ‘-v’ и ‘-rfc’.
Полную англоязычную версию документации на keytool можно найти здесь.
Пример просмотра хранилища и сертификата
На скриншоте представлен пример CertificateReader, позволяющий просматривать хранилище ключей и сертификаты, а также извлекать информацию о сертификате.
Внутри сертификата хранится пара значений Distinqueshed Names. Один DN принадлежит владельцу сертификата, а второй DN указывает идентификатор цента сертификации (CA), подписавшего сертификат. В случае с самоподписанным (self-signed) сертификатом, оба эти DN указывают на владельца сертификата.
Листинг примера
Интерфейс примера выполнен с использованием библиотеки Swing. Поскольку Swing не является предметом данной статьи, то методы формирования интерфейса не представлены в листинге примера. При необходимости желающие могут скачать исходный код примера в конце страницы.
В листинге примера представлены два метода : loadKeyStore, showCertificate. Первый метод позволяет выбрать хранилище сертификатов. Второй метод выполняет чтение сертификата и представление его параметров в интерфейсе. После листинга представлен скриншот, на котором выполнено чтение созданного сертификата.
Примечание : класс CertificateReader используется в качестве примера на странице цифровой подписи jar файлов
Скачать пример
Рассмотренный на странице пример просмотра хранилища ключей и сертификатов можно скачать здесь (2.5 Кб).
Предложение от 8host.com
Основы Java Keytool: работа с Java Keystore
Java Keytool – это инструмент Java для управления ключами, сертификатами и хранилищами ключей. Java Keystore (или JKS) – это хранилище сертификатов открытых ключей и авторизации, которое часто используется приложениями на основе Java для шифрования, аутентификации и установки соединений HTTPS. Все его записи защищены паролем хранилища ключей. Запись хранилища ключей идентифицируется псевдонимом и содержит надежные ключи и сертификаты.
Данное руководство описывает использование команд keytool, очень полезных при работе с JKS. Также оно охватывает создание и редактирование хранилищ ключей Java для Java-приложений.
Создание и импортирование записей
Данный раздел посвящен командам Java Keytool, которые создают пары ключей и сертификатов, а также импортируют сертификаты.
Создание ключей
Используйте этот метод для поддержки HTTPS (HTTP по TLS). В данном разделе показано, как создать новую пару ключей в новом или уже существующем хранилище ключей Java, которые могут быть использованы для создания запроса на подпись сертификата (CSR) или получения SSL-сертификата в центре сертификации.
Данная команда сгенерирует пару 2048-битных RSA-ключей под указанным псевдонимом (в данном случае это domain) в указанном файле хранилища (keystore.jks).
keytool -genkeypair
-alias domain
-keyalg RSA
-keystore keystore.jks
Если же заданного хранилища ключей не существует, оно будет создано после получения запрашиваемой информации (а именно пароля хранилища ключей, строки Distinguished Name (для закрытого ключа) и пароля закрытого ключа).
Создание CSR для существующего закрытого ключа
Чтобы сгенерировать запрос на подпись сертификата, который можно отправить в ЦС для получения надежного SSL-сертификата, следуйте данному разделу руководства. Для этого понадобятся уже существующее хранилище ключей и псевдоним.
Данная команда создаст CSR (domain.csr), подписанный закрытым ключом с псевдонимом domain в хранилище keystore.jks:
keytool -certreq
-alias domain
-file domain.csr
-keystore keystore.jks
Введите пароль хранилища ключей, после чего запрос будет создан.
Импортирование подписанного/Root/промежуточного сертификата
В данном разделе показано, как импортировать сертификаты (например, подписанный ЦС сертификат) в хранилище ключей. Он должен соответствовать закрытому ключу с определенным псевдонимом. Также данную команду можно использовать для импортирования root или промежуточного сертификата, который может потребовать ЦС для завершения доверительной цепочки. Просто укажите уникальный псевдоним, (например, root вместо domain) и сертификат, который необходимо импортировать.
Следующая команда импортирует сертификат (domain.crt) в хранилище ключей (keystore.jks) под указанным псевдонимом (domain). Подписанный сертификат при импортировании должен соответствовать закрытому ключу с указанным псевдонимом:
keytool -importcert
-trustcacerts -file domain.crt
-alias domain
-keystore keystore.jks
На данном этапе будет предложено ввести пароль хранилища ключей, а затем подтвердить импортирование.
Примечание: можно также использовать эту команду, чтобы импортировать сертификаты ЦС в Java truststore (хранилище доверенных сертификатов), которое, как правило, находится в $JAVA_HOME/jre/lib/security/cacerts, (предполагается, что JRE или JDK установлены в $JAVA_HOME).
Создание самоподписанного сертификата в новом/существующем хранилище
В данном разделе показано, как создать самоподписанный сертификат для приложения Java. На самом деле, для этого используется та же команда, что и для создания новой пары ключей, но с параметром days, задающим срок действия сертификата.
Итак, данная команда создаст пару 2048-битных RSA-ключей, действительных на протяжении 365 дней, с указанным псевдонимом (domain) в заданном файле ключей (keystore.jks):
keytool -genkey
-alias domain
-keyalg RSA
-val >365
-keystore keystore.jks
Если заданного хранилища ключей не существует, команда создаст его, получив необходимые данные (это пароль хранилища, Distinguished Name (дл закрытого ключа) и пароль закрытого ключа).
Просмотр записей хранилища ключей
В данном разделе речь пойдет о содержимом Java Keystore, а именно о просмотре информации сертификата и экспортировании сертификатов.
Проверка контрольной суммы сертификата
Данная команда выводит список контрольных сумм всех сертификатов хранилища (keystore.jks) с соответствующими псевдонимами.
keytool -list
-keystore keystore.jks
При этом будет запрошен пароль хранилища. Кроме того, можно ограничить вывод до определенного псевдонима с помощью опции -alias domain (где domain — нужный псевдоним).
Подробное содержание хранилища
Данная команда выведет подробную информацию о записях, находящихся в хранилище keystore.jks, в том числе длину цепи сертификата, контрольных сумм сертификатов в цепочке, имена (distinguished name), серийные номера, а также дату создания и срок дейтвия по псевдонимам:
keytool -list -v
-keystore keystore.jks
На данном этапе нужно ввести пароль хранилища ключей. Опять же, с помощью опции -alias domain (где domain – это псевдоним) можно ограничить вывод до определенного псевдонима.
Примечание: также эту команду можно использовать, чтобы просмотреть сертификаты в хранилище доверенных сертификатов Java (как правило, оно находится в $JAVA_HOME/jre/lib/security/cacerts, если JRE или JDK установлены в $JAVA_HOME).
Использование Keytool для просмотра информации о сертификате
Данная команда выведет подробную информацию о файле сертификата (certificate.crt), в том числе контрольную сумму, distinguished name владельца и срок его действия:
keytool -printcert
-file domain.crt
При этом нужно ввести пароль хранилища.
Экспортирование сертификатов
Данная команда экспортирует бинарный DER-зашифрованный сертификат (domain.der) с псевдонимом (domain) в хранилище (keystore.jks):
keytool -exportcert
-alias domain
-file domain.der
-keystore keystore.jks
Укажите пароль хранилища ключей.
Редактирование хранилища ключей
Данный раздел охватывает редактирование записей Java Keystore (например, удаление и изменение псевдонимов).
Изменение пароля хранилища
При помощи этой команды можно изменить пароль хранилища (keystore.jks):
keytool -storepasswd
-keystore keystore.jks
Укажите текущий пароль хранилища ключей, а затем новый пароль. Задать новый пароль можно и при помощи самой команды, внеся в нее опцию -new newpass, где newpass – новый пароль.
Удаление псевдонима
Данная команда удалит псевдоним domain из хранилища keystore.jks:
keytool -delete
-alias domain
-keystore keystore.jks
Укажите пароль хранилища.
Изменение псевдонима
При помощи данной команды можно изменить псевдоним (например, domain на newdomain):
keytool -changealias
-alias domain
-destalias newdomain
-keystore keystore.jks
Итоги
Данное руководство описывает большинство операций, которые выполняются при управлении Java Keystores. Конечно, охватить все функции в одной статье невозможно. Но зная базовые команды, можно самостоятельно поэкспериментировать с управлением хранилищами.
Данное руководство основано на версии хранилища ключей, которое поставляется с Java 1.7.0. чтобы установить Java, читайте данную статью.
Криптография в Java. Утилита Keytool
Привет, Хабр! Представляю вашему вниманию перевод 10 статьи «Java Keytool» автора Jakob Jenkov из серии статей для начинающих, желающих освоить основы криптографии в Java.
Оглавление:
Утилита Keytool
Java Keytool — это инструмент командной строки, который может генерировать пары открытый ключ / закрытый ключ и сохранять их в хранилище ключей. Исполняемый файл утилиты распространяется вместе с Java SDK (или JRE), поэтому, если у вас установлен SDK, значит она у вас также будет предустановлена.
Исполняемый файл называется keytool . Чтобы выполнить его, откройте командную строку (cmd, console, shell и т.д.). и измените текущий каталог на каталог bin в каталоге установки Java SDK. Введите keytool , а затем нажмите клавишу Enter . Вы должны увидеть что-то похожее на это:
Как видите, утилита keytool поддерживает набор команд для работы с ключами, сертификатами и хранилищами ключей. В этом руководстве будут рассмотрены наиболее часто используемые из этих команд.
Скрипты Keytool
Команды утилиты Keytool принимают много аргументов, правильность установки которых может быть трудно запомнить. Поэтому рекомендуется создать несколько скриптов CMD или Shell с последовательностью команд Keytool . Эти сценарии упрощают повторное выполнение команд, а также позволяют вернуться назад и посмотреть, как было создано хранилище ключей.
Генерация ключевой пары
Генерация ключевой пары (открытый ключ / закрытый ключ) является одной из наиболее распространенных задач, для которых используется утилита Keytool . Сгенерированная пара ключей вставляется в файл KeyStore как пара ключей с собственной подписью. Вот общий формат командной строки для генерации пары ключей:
Аргументы объяснены в разделе Аргументы Keytool. Не все эти аргументы нужны и многие являются не обязательными. Утилита сообщит вам, если вы пропустили обязательный аргумент. Вот пример команды, которая импортирует сертификат в KeyStore. Не забудьте удалить разрывы строк при вводе команды в командной строке.
Список записей хранилища
Чтобы вывести список записей в хранилище ключей, вы можете использовать команду list . Ниже представлен формат для команды list . Разрывы строк предназначены только для упрощения чтения. Удалите разрывы строк перед выполнением команды:
Вот пример команды list . Не забудьте удалить разрывы строк!
Эта команда выведет список всех записей в данном хранилище ключей. Результат выполнения будет выглядеть примерно так:
Если вы включите аргумент alias в команду list , в список попадет только запись, соответствующая данному псевдониму. Вот пример команды list с аргументом alias :
Результат выполнения вышеупомянутой команды:
Удаление записи хранилища ключей
Так же в в утилите keytool имеется команда, которая может удалить запись из хранилища ключей: delete . Вот формат этой команды:
Вот пример вызова команды delete . Не забудьте удалить разрывы строк перед запуском!
Эта команда удаляет запись хранилища с псевдонимом testkey хранящегося в файле keystore.jks .
Генерация запроса на сертификат
Утилита keytool может генерировать запрос сертификата с помощью команды certreq . Запрос сертификата — это запрос к центру сертификации (ЦС) на создание публичного сертификата для вашей организации. После создания запроса на сертификат он должен быть отправлен в центр сертификации, в котором вы хотите создать сертификат (например, Verisign, Thawte или какой-либо другой центр сертификации). Прежде чем вы сможете сгенерировать запрос сертификата для личного ключа и пары открытых ключей, вы должны сгенерировать этот закрытый ключ и пару открытых ключей в хранилище ключей (или импортировать его). Как это сделать можно посмотреть в соответсвтующей главе. Вот формат команды для генерации запроса сертификата. Не забудьте удалить все разрывы строк при использовании этой команды:
Вот пример команды -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 которая генерирует пару ключей и создает хранилище.
Trusted java ключ
Keystore используется для хранения собственных приватных ключей и сертификатов сервера или клиента.
Для аутентификации клиента и сервера устанавливающих SSL соединение требуются приватные ключи и сертификаты. Если используется односторонняя аутентификация, то keystore нужен только на серверной стороне. При двусторонней аутентификации и клиент и сервер обмениваются сертификатами, соответственно и у сервера, и у клиента должен быть keystore с парой приватный ключ/публичный ключ + сертификат.
Т.е. иными словами Keystore используется для хранения ключей и сертификатов, использующихся для идентификации владельца ключа (клиента или сервера).
Trust Store
Второй тип keystore применяется для хранения trusted сертификатов. В него кладутся ключи trusted certificate authorities CA. При пользовании самоподписанными сертификатами, в trusted store может класться самоподписанный сертификат. Это тоже keystore, но в Java он называется trusted store.
Форматы Keystore поддерживаемые Java
Т.о., как описано выше, keystore — контейнер, используемый для хранения ключей и сертификатов. Java поддерживает два формата keystore:
- JKS (Java Key Store) – Java format
- PKCS12 — this is an industry standard
Тип keystore, используемый по-умолчанию, задается в Java security properties файле свойством keystore.type. Если приложение обращается к key store файлу без явного указания его типа, используется JKS формат. Java security properties файл расположен в каталоге lib внутри инсталляционного директория с Java по пути: /lib/security/java.security
Для работы с keystore в java дистрибутиве есть специальная утилита keytool. Keytool вполне достаточно для операций с ключами в Java. Однако JKS формат является пропиетарным и закрытым. Поэтому часто для разнообразных конвертаций и взаимодействия со сторонними разработчиками могут использоваться утилиты, поставляемые в комплекте с библиотекой OpenSSL.
В тех случаях, когда планируется использовать ключи исключительно в Java keystore в формате JKS вполне подойдет.
Алиасы
Keystore (по крайней мере в JKS формате), позволяет хранить несколько пар ключей и сертификатов. Для идентификации каждой пары или отдельного сертификата используется алиас. Алиас указывается в исходном коде при доступе к соответствующему ключу или сертификату. Доступ к каждому алиасу ограничивается паролем.
Создание keystore
Процесс генерации keystore (JKS или PKS12) включает генерацию пары ключей (приватного и публичного). Затем получение от Certificate Authority (CA) подписи к публичному ключу и связанной с ним идентифицирующей информации в виде сертификата. Certificate authority генерирует сертификат на основе публичного ключа и идентификационной информации, переданной ему в виде CSR.
Wikipedia говорит, что CA выдает сертификат, привязывающий публичный ключ к указанному Distinguished Name (это может быть имя хоста (hostname, имя пользователя или название приложения). Шаги по созданию keystore представляющего пользователя, приложение или хост следующие:
1) Сгенерировать пару ключей (public / private key)
В java при генерации пары ключей с помощью keytool сразу создается самоподписанный self-signed сертификат, который можно немедленно использовать для тестирования. Следующие шаги, таким образом, нужны только для создания полноценного официального сертификата.
2) Сгенерировать запрос на получение сертификата (Certificate Signing Request (CSR)).
3) Получить CSR, подписанный доверенным CA (output of this is a certificate)
4) Импортировать сертификат, сделанный CA в ваш key store.
5) Импортировать сертификат CA в ваш truststore как trusted certificate
Java’s Default Keystore
Веб-сервер или приложение может сказать Java использовать заданный keystore файл установкой свойства javax.net.ssl.keyStore. (указывается путь к файлу keystore). Если приложение не укажет keystore property, тогда загружается keystore по-умолчанию. Keystore по-умолчанию хранится в файле .keystore в пользовательском домашнем директории, определяемом в свою очередь системным свойством user.home.
Java’s Default Truststore
Приложение может указать Java использовать определенный truststore файл установкой свойства javax.net.ssl.trustStore. Если приложение не указывает явно truststore, тогда truststore по-умолчанию загружается и используется. По-умолчанию java truststore находится в /lib/security/cacerts и его пароль по-умолчанию: ‘changeit’. Файлы truststore — обычные keystore файлы, содержащие один или более сертификатов trusted CA (Certificate Authorities).
Keytool
Для облегчения создания и управления keystore файлами в дистрибутив Java входит утилита keytool, позволяющая создавать JKS файлы. Keytool позволяет управление сертификатами и парами публичных приватных ключей.
С опцией -genkey, keytool генерирует новую пару public/private ключей, и для public ключа создает self-signed сертификат.
Сертификат создается в формате X.509. В этом формате в качестве идентификатора владельца используется Distinquished Name или просто DN в формате X.500. Точно такой же формат идентификации объектов используется, например в LDAP-протоколе или в SNMP. Distinquished Name задается в виде разделенных через запятую атрибутов: «CN=Andrey Chesnokov, OU=dev64, O=dev64-wordpress, L=Unknown, ST=Unknown, C=RU». Здесь отдельные атрибуты расшифровываются так:
- CN — common name имя владельца
- OU — organizationUnit (e.g, department or division) департамент или отдел
- O — organizationName — large organization name, e.g., «ABCSystems, Inc.»
- L — localityName — locality (city) name, e.g., «Palo Alto» местоположение (город)
- ST — stateName — state or province name, e.g., «California»
- C — country — two-letter country code, e.g., «CH»
Часть из атрибутов могут быть пропущены, в данном случае им присвоено значение Unknown. При генерации тестового keystore, значения можно присваивать любые. При получении официального сертификата, данные регламентируются и проверяются Certificate Authority организацией.
Внутри каждого сертификата в формате X.509 хранится пара Distinqueshed Names (DN), один DN принадлежит владельцу сертификата, а второй DN указывает идентификатор CA, подписавшей сертификат. В случае с self-signed сертификатом, оба эти DN указывают на владельца сертификата.
Distinquished Name задается keytool с помощью опции -dname. Если опцию dname не указать, тогда keytool запросит все необходимые поля из командной строки.
Опция keystore задает имя keystore файла. Если её пропустить, тогда keytool создаст файл с именем .keystore в домашнем директории пользователя.
Доступ к keystore защищается паролем. Соответственно опция -keypass указывает пароль для доступа к keystore целиком. Этот пароль необходим для возможности чтения или модификации keystore.
Второй пароль, как уже говорилось выше, необходим для доступа к отдельному алиасу внутри keystore. Этот второй пароль указывается с помощью опции -keypass.
Т.о. с помощью одной команды получается keystore с парой ключей и сертификатом, остается этот keystore взять и подложить в нужный каталог к своей программе. Но это уже другая история.
Обязательно стоит почитать официальную документацию на keytool, она содержит много полезного.
Некоторые команды для работы с сертификатами: