Учебник по Java Keystore –

Учебник по Java Keystore - Сертификаты
Содержание
  1. Введение
  2. OpenSSH и ssh-keygen
  3. Управление ключевыми файлами и конвертация (rsa, pkey)
  4. Используйте ключ (rsautl), не поддерживает большие файлы
  5. Корневые сертификаты
  6. Центры сертификации
  7. Цепочка сертификатов
  8. Команды хранилища ключей
  9. Jarsigner
  10. Keytool: управление ключами и сертификатами
  11. Puttygen
  12. Визард
  13. Два, openssl
  14. Другой
  15. Загрузка хранилища ключей
  16. Изменение пароля хранилища
  17. Изменение псевдонима
  18. Импортирование подписанного/root/промежуточного сертификата
  19. Использование keytool для просмотра информации о сертификате
  20. Номенклатура сертификатов
  21. Откуда берутся сертификаты?
  22. Подробное объяснение команд gpg
  23. Получение ключей
  24. Помещение ключей в хранилище
  25. Проверка контрольной суммы сертификата
  26. Просмотр записей хранилища ключей
  27. Пятерка, pgp
  28. Редактирование хранилища ключей
  29. Словарный запас
  30. Создание csr для существующего закрытого ключа
  31. Создание и импортирование записей
  32. Создание хранилища ключей
  33. Сценарий №1 — найти следующего в связке
  34. Удаление псевдонима
  35. Файл p7b / pkcs # 7 (pem)
  36. Файл pfx / pkcs # 12 (pem)
  37. Формат der
  38. Формат pem (pkcs # 8)
  39. Хранение
  40. Хранилище ключей
  41. Четыре, gpg
  42. Экспортирование сертификатов
  43. Генерация ключей (genrsa, genpkey, req генерировать ключи одновременно с запросом сертификата, gendh, gendsa)
  44. Итоги

Введение

Кто из нас не посещал ebay, amazon, чтобы купить что-нибудь, или его личный банковский счет, чтобы проверить это. Считаете ли вы, что эти сайты достаточно безопасны для размещения ваших личных данных, таких как (номер кредитной карты или номер банковского счета и т. Д.)?

Большинство этих сайтов используют протокол Socket Layer (SSL) для защиты своих интернет-приложений. SSL позволяет зашифровывать данные от клиента, такого как веб-браузер, перед передачей, так что кто-то, пытающийся перехватить данные, не сможет их расшифровать.

Многие серверы приложений Java и веб-серверы поддерживают использование хранилищ ключей для конфигурации SSL. Если вы создаете безопасные Java-программы, обучение созданию хранилища ключей является первым шагом.

OpenSSH и ssh-keygen

OpenSSH – это версия протокола SSH с открытым исходным кодом (SSH: Secure SHell). Используйте SSH для реализации зашифрованной связи через компьютерную сеть, удаленного управления, передачи файлов между компьютерами и т. Д. Данные, передаваемые по SSH, зашифрованы, что более безопасно, чем telnet, rcp, ftp, rlogin, rsh и другие инструменты, передающие пароли в виде открытого текста.

OpenSSH предоставляет множество инструментов для реализации протокола SSH. Среди них ssh-keygen используется для генерации, управления и преобразования ключей и сертификатов для аутентификации.

ssh-keygen

Управление ключевыми файлами и конвертация (rsa, pkey)

(1) openssl rsa [options]  <infile  >outfile

  • -in <infile> Введите ключевой файл
  • -passin pass:<password> Введите пароль защиты ключа
  • -inform  <DER|NET|PEM> Введите формат ключа, по умолчанию PEM
  • -out <outfile> Выходной ключевой файл
  • -outform <DER|NET|PEM> Формат выходного ключа, по умолчанию – PEM
  • -passout pass:<password> Пароль защиты выходного ключа
  • -pubin Указывает, что ввод – это открытый ключ, а вывод по умолчанию – это пара ключей или закрытый ключ.
  • -pubout Экспорт открытого ключа в файл (открытый ключ, как правило, не нужно шифровать)
  • -des, -des3, -aes128, -aes192, -aes256 Указать алгоритм шифрования ключа
  • -text Очистить ключевые параметры вывода текста
  • -noout Не выводить ключ в файл
  • -check Проверить согласованность
  • -modulus Отображение ключевого модуля RSA

пример

# Извлечь публичный ключ ключа в отдельный файл
openssl rsa -in rsakey0.pem -pubout -out rsakey0.pub    

 # Формат ключа конверсии (DER-> PEM)
openssl rsa -in rsakeypair.der -inform DER -out rsakeypair.pem 

# Изменить алгоритм шифрования, снять защиту паролем
openssl rsa -in rsakeypair.pem -passin pass:123456 -des3 -out rsakeypair1.pem

(2) openssl pkey [options]  v1.0.1

(3) Другой способ преобразовать ключи формата PEM в ключи формата DER, которые могут использоваться Java JCE.

openssl pkcs8 -topk8 -inform PEM -outform DER -in <rsa_pem.key> -out <pkcs8_der.key> -nocrypt

(4) преобразование открытого ключа OpenSSL и формата открытого ключа OpenSSH

Формат открытого ключа, сгенерированного OpenSSL, несовместим с форматом открытого ключа OpenSSH. Если открытый ключ, сгенерированный OpenSSL, используется для настройки SSH-соединения, проверка завершится неудачно.

Формат открытого ключа OpenSSL (PEM):

Формат открытого ключа OpenSSH:

  • Восстановить открытый ключ формата OpenSSH из закрытого ключа
ssh-keygen -y -f priKey.pem   > sshPubkey.pub
  • Преобразование открытого ключа формата OpenSSL в формат OpenSSH
ssh-keygen  -i -m PKCS8 -f sslPubKey.pub〉 sshPubKey.pub # -m поддерживает PEM, PKCS8, RFC4716
  • Преобразование открытого ключа формата OpenSSH в открытый ключ формата OpenSSL
ssh-keygen -e -m PEM  -f sshPubKey.pub> sslPubKey.pub # -m поддерживает PEM, PKCS8, RFC4716

Используйте ключ (rsautl), не поддерживает большие файлы

openssl rsautl  [options]

  • -in <файл> Введите файл для шифрования и дешифрования.
  • -out <файл> Вывести зашифрованный или расшифрованный файл
  • -inkey <файл> Введите файл ключа
  • -passin pass: <password> Ввести пароль защиты ключевого файла
  • -keyform <PEM | DER | NET> Введите формат файла ключей, по умолчанию – PEM
  • -pubin Указывает, что ввод – это файл открытого ключа
  • -certin Указывает, что ввод – это сертификат, содержащий открытый ключ
  • -sign Использовать закрытый ключ для подписи (шифрования)
  • -verify Похоже, что открытый ключ используется для проверки подписи (расшифровки)
  • -encrypt Использовать шифрование с открытым ключом
  • -decrypt Использовать закрытый ключ для расшифровки
  • -hexdump вывод шестнадцатеричный
  • -pkcs, -ssl, -raw, -oaep Метод завершения данных, по умолчанию – pkcs

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

Пример:

# Использовать открытый ключШифрование
openssl rsautl -in test.txt  -out test_enc.txt -inkey rsakeypair.pub -pubin -encrypt

 # Использовать закрытый ключ для расшифровки
openssl rsautl -in test_enc.txt -out text_dec.txt -inkey rsakeypair.pem -decrypt

# Войти с закрытым ключом
openssl rsautl -in test.txt -out test_sign.txt -inkey rsakeypair.pem -sign

# Использовать открытый ключ для проверки подписи
openssl rsautl -in test_sign.txt -out test_unsign.txt -inkey rsakeypari.pub -pubin -verify

Корневые сертификаты

Корневой сертификат CA — это сертификат CA, который представляет собой самозаверяющий сертификат. Этот сертификат представляет объект, который выдает сертификат и известен как Центр сертификации или CA, такой как VeriSign, Thawte и т. Д.

Центры сертификации

Компании, которые будут подписывать сертификаты для вас, такие как VeriSign, Thawte, Commodo, GetTrust. Кроме того, многие компании и учреждения действуют как свои собственные CA, либо создавая полную реализацию с нуля, либо используя опцию с открытым исходным кодом, такую ​​как OpenSSL.

Цепочка сертификатов

Когда сервер и клиент устанавливают соединение SSL, клиенту предоставляется сертификат; клиент должен определить, доверять ли этому сертификату, этот процесс называется цепочкой сертификатов. Клиент проверяет эмитента сертификата, просматривает его список доверенных корневых сертификатов и сравнивает эмитента в представленном сертификате с субъектами доверенных сертификатов.

Если совпадение найдено, соединение продолжается. Если нет, веб-браузеры могут открыть диалоговое окно, предупреждая вас о том, что он не может доверять сертификату, и предлагая возможность доверять сертификату.

Команды хранилища ключей

Создание хранилища ключей, ключей и запросов сертификатов

Импортные сертификаты

Экспортные сертификаты

Проверить / Список / Просмотр сертификатов

Удалить сертификаты

Изменить пароли

Jarsigner

Итак, разобрались с keytool. Знаем, как создавать хранилище с ключами и как посмотреть инфу о существующих. Осталось узнать, как подписать приложение ключом. Для этого используется другая утилита – jarsigner.

Скрипт подписи выглядит так:

jarsigner -keystore mykeys.keystore -storepass spassword -keypass kpassword1 Package1.apk mykey1

Имена параметров нам знакомы по keytool: хранилище (keystore), пароль (storepass) к нему и пароль (keypass) к ключу. А последние два параметра – это имя APK-файла, который вы хотите подписать и алиас ключа из указанного хранилища, который вы хотите использовать для подписи.

После этого приложение будет подписано и система примет его к установке.

Ради интереса давайте попробуем установить неподписанный APK. Чтобы создать его надо щелкнуть правой кнопкой мыши на проекте в Eclipse и выбрать Android tools > Export Unsigned Application Package. Далее указываем путь, куда сохранить APK-файл.

Попробуем установить приложение на эмулятор с помощью adb. Получаем ошибку Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES]:

Система обнаружила, что приложение не подписано.

Если же сначала закинуть APK на эмулятор и там запустить файловым менеджером, получим такое сообщение при установке:

Keytool: управление ключами и сертификатами

keytool – это утилита для работы с ключами и сертификатами из
стандартного дистрибутива java. Она позволяет генерировать новые пары
закрытых/открытых ключей, управлять ими, создавать запросы на подпись,
экспортировать и импортировать сертификаты; иными словами, она умеет
делать практически всё, кроме подписывания запросов на подпись сертификата.

Про сертификаты:  Нет полного доверия к сертификату подписи КриптоАрм — как исправить ошибку

Далее в посте – перечень наиболее часто используемых и самых полезных команд этой классной утилиты.

N.B.#2. По умолчанию – если не задать путь – создаваемое хранилище размещается в файле
.keystore в домашней директории пользователя; если хранилище с указанным
именем не существует, то оно будет создано.

N.B.#3. Ключ -v (verbose) включает вывод подробной информации. Иногда весьма полезно и интересно.

* Создание хранилища и генерация пары ключей (закрытый ключ
сохраняется под паролем, открытый ключ “оборачивается” в самоподписанный
сертификат).

Первым показан самый простой вариант команды, когда мы
только просим сгенерировать ключ; некоторая дополнительная информация
при этом будет запрошена интерактивно в процессе выполнения, а многие
параметры используются с дефолтными значениями (например, алиас – mykey,
хранилище – .keystore в домашней директории пользователя, алгоритм
шифрвания – SHA1withDSA и пр.).

Все параметры могут указывать сразу в строке команды; так, во втором
варианте примера задаётся информация о компании и пр., название алиаса,
тип и размещение хранилища, срок действия, алгоритм для генерации
ключей, размер ключа, пароли на хранилище и на ключ.

keytool -genkey


keytool -v -genkey -dname
“CN=company.ru, OU=dept, O=company, L=city, C=BY” -alias father
-storetype jks -keystore teststore.jks -validity 180 -keyalg RSA
-keysize 2048 -storepass mystorepass -keypass mykeypass

* Ключи в хранилище – это хорошо. Но как достать данные из него? Для
этого полезен

экспорт сертификата из хранилища

. Первая команда выведет
сертификат в бинарном виде

DER

; вторая – то
же, но в

base64

-кодированном формате; ну, а третья создаст файл

sert

.

crt

с

base64

-сертификатом (сам сертификат размещается между “

—–BEGINCERTIFICATE—–

” и “

—–ENDCERTIFICATE—–

“).

keytool -v -exportcert -alias father -keystore store.jks


keytool -v -exportcert -alias father -keystore store.jks –rfc


keytool -v -exportcert -alias father -keystore store.jks -rfc -file sert.crt

* Файл сертификата получен, внутри – много символов, которые человеку
ничего не говорят. Просмотр файла сертификата поможет
извлечь информацию. Команда выведет на экран информацию о владельце
сертификата, срок действия, отпечатки сертификата и другие данные. Таким
же образом можно просмотреть не только созданный нами, но и любой
другой сертификат.   

* Если требуется просмотр сертификата непосредственно в хранилище или содержимого всего хранилища:

keytool -v -list -keystore store.jks -storepass mystorepass -alias father


keytool -v -list -keystore store.jks -storepass mystorepass

* Что можно сделать с файлом сертификата? Можно посмотреть сертификат в операционной системе, можно установить его в доверенные сертификаты браузера,
импортировать в другое хранилище как доверенный (об этом чуть позже).
Однако пока наш сертификат “самоподписанный”, т. е. “мы его сделали, и
сами же его удостоверили, и обещаем, что он хорош”. Однако на практике,
думается, многие не будут доверять такому сертификату (и правильно
сделают). Чтобы обеспечить доверие, надо подписать наш сертификат в
каком-нибудь CA – центре сертификации  (thawte, verisign ипр.), которому все
доверяют. Для начала требует сгенерировать запрос на подпись сертификата
(certificatesigningrequest, CSR). В результате выполнения будет
создан файл testcsr.csr, тот самый, который нужно будет передать в CA для подписи нашего сертификата.

keytool -v -certreq -alias father -keystore store.jks -file testcsr.csr -storepass mystorepass -keypass mykeypass

* Положим, мы прошли процедуру проверки нашего сертификата выбранным CA и
получили назад удостоверенный и подписанный сертификат. Теперь необходим импорт сертификата в хранилище. Но перед этим – что очень важно –
надо импортировать все доверенные сертификаты (корневые и промежуточные)
центра сертификации. Это необходимо для того, чтобы удалось построить
цепочку: наш сертификат подписан CA#1, в свою очередь тот подписан CA#2 и
т. д. до корневого CA, которому мы верим “на слово”, потому что он
известен всем.

keytool -v -importcert -keystore store.jks -alias cacert-root -file cacert-root.crt
keytool -v -importcert -keystore store.jks -alias cacert-intm -file cacert-intermediate.crt
keytool -v -importcert -keystore store.jks -alias father -file testcsr-signed.crt

* Также могут оказаться полезными следующие команды:

Другой инструментарий по теме

OpenSSL

opensource

криптографический пакет (см. также

wiki

).

Полезные ссылки

keytool

KeyandCertificateManagementTool

” – основная документации для чтения,

jdk5

,

jdk6

,

jdk7
TheMostCommonJavaKeytoolKeystoreCommands
Утилита keytool для управления JAVA-хранилищами сертификатов
AfewfrequentlyusedSSLcommands

Puttygen

Основное содержание этой статьи – управление ключами, все только объясняет использование PuTTYgen.

Формат хранения ключей, используемый PuTTYgen, аналогичен OpenSSL (расширение файла ключей .ppk, которое содержит как открытые, так и закрытые ключи).

Формат открытого ключа

---- BEGIN SSH2 PUBLIC KEY ----
Comment: "imported-openssh-key"
AAAAB3NzaC1yc2EAAAABIwAAAQEA5of83WbXgRVTUFsOI49wacuEp253YuzZW1Lk
......
vw7Oc6o357ipDPgWk9c82s 7Asov4OgX5o6hg3R7418Gc0lkqw==
---- END SSH2 PUBLIC KEY ----

Формат закрытого ключа (.ppk)

Визард

Eclipse предоставляет визард, который позволяет реализовать все вышеописанные шаги по подготовке приложения к установке. Для этого надо на проекте в Eclipse щелкнуть правой кнопкой и выбрать Android tools > Export Signed Application Package.

Визард на всякий случай уточнит проект

Затем надо выбрать: использовать существующее хранилище или создавать новое. Если используем существующее, то выбираем его и вводим пароль к этому хранилищу.

Жмем Next, и визард спрашивает, какой из существующих ключей использовать, либо дает возможность создать новый.

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

Осталось указать путь и имя файла, куда Eclipse сохранит готовое, подписанное и сжатое приложение. Заодно он сразу показывает срок действия сертификата.

Жмем Finish и получаем готовое приложение, которое можно публиковать на маркете.

Если же у вас пока нет ключа, то визард поможет вам его создать, чтобы не надо было возиться с консолью и keytool.

В этом случае вы указываете, что хотите создать хранилище

Далее надо создать ключ

Здесь вы указываете алиас, пароль, срок действия (в годах)  и инфу о владельце.

Ну и остается указать путь к создаваемому файлу

По идее, я мог бы сразу показать вам этот визард, который за вас все сделает, но я думаю, что вы не понимали бы значение всех его экранов и полей. А это не очень хорошая практика – пользоваться тем, чего не понимаешь. Поэтому я подробно расписал механизм ключей и подписи приложений, чтобы вы представляли себе, как устроен этот процесс и что делает визард.

По поводу срока действия ключа, в хелпе пишут, что рекомендуется ставить 25 лет. И что при публикации приложения на маркете, проверяется, что срок действия закончится позднее, чем 22 октября 2033. Думаю, эта дата будет периодически сдвигаться.

На следующем уроке:

– разбираемся, что такое Package для приложения

Два, openssl

OpenSSL – это мощная криптографическая библиотека на уровне защищенных сокетов, включающая алгоритмы шифрования, часто используемые ключи и управление сертификатами, протокол SSL и другие функции. OpenSSL предоставляет множество команд. Здесь мы лишь кратко перечислим некоторые операции OpenSSL для генерации ключей и сертификатов (Window необходимо запускать cmd от имени администратора).

Ключ v1.0.1 по умолчанию использует формат PKCS # 8 (предыдущая версия была PEM).

Посмотреть версию openSSL

openssl version
openssl version -a

включить симметричное шифрование

Другой

Файл ключа (.pem), файл запроса на выдачу (.csr) и файл сертификата (.cet), сгенерированные OpenSSL, представляют собой информацию в кодировке Base64, сохраненную в текстовом формате (Формат PEM). Его можно открыть с помощью текстового редактора, и его содержимое выглядит следующим образом:

—–BEGIN RSA PRIVATE KEY—–MIIEogIBAAKCAQEArlUX2v998Y Ek/AzoDdsbW7ILyRpwXVBMDqmOf3ZZpbP/4vo….. Пропустите несколько строк …buL0a0BOFi7dyJjWgtEyYTFQgYSeezHl/ XyOhuJlTyvZWUpm5w=—–END RSA PRIVATE KEY—–

Первая и последняя строки будут проигнорированы, первая строка показывает тип информации, хранящейся в файле.

Просмотр информации о подписи

jarsigner -verify -verbose -certs <jksSignedFile>  

Загрузка хранилища ключей

Прежде чем использовать экземпляр хранилища ключей, его необходимо загрузить. Экземпляры класса KeyStore часто записываются на диск или в другое хранилище для последующего использования, потому класс KeyStore предполагает, что вы должны прочитать его данные, прежде чем сможете его использовать. Однако можно инициализировать пустой экземпляр KeyStore без данных, как вы увидите позже.

Про сертификаты:  Проводить предрейсовые медосмотры силами своих работников можно только при наличии лицензии

Загрузка данных из файла или другого хранилища выполняется путем вызова метода load() который принимает два параметра:

Вот пример загрузки хранилища ключей:

char[] keyStorePassword = "123abc".toCharArray();
try(InputStream keyStoreData = new FileInputStream("keystore.ks")){
    keyStore.load(keyStoreData, keyStorePassword);
}

В этом примере загружается файл хранилища ключей keystore.ks. Если вы не хотите загружать какие-либо данные в хранилище ключей, просто передайте значение null для параметра InputStream. Вот как выглядит загрузка пустого хранилища ключей:

keyStore3.load(null, keyStorePassword);

Экземпляр класса KeyStore всегда должен загружаться либо с данными, либо с null. В противном случае хранилище ключей не инициализируется, и все вызовы его методов будут вызывать исключения.

Изменение пароля хранилища

При помощи этой команды можно изменить пароль хранилища (keystore.jks):

keytool -storepasswd -keystore keystore.jks

Укажите текущий пароль хранилища ключей, а затем новый пароль. Задать новый пароль можно и при помощи самой команды, внеся в нее опцию -new newpass, где newpass – новый пароль.

Изменение псевдонима

При помощи данной команды можно изменить псевдоним (например, domain на newdomain):

keytool -changealias -alias domain -destalias newdomain -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).

Использование keytool для просмотра информации о сертификате

Данная команда выведет подробную информацию о файле сертификата (certificate.crt), в том числе контрольную сумму, distinguished name владельца и срок его действия:

keytool -printcert -file domain.crt

При этом нужно ввести пароль хранилища.

Номенклатура сертификатов

Давайте рассмотрим, какие сертификаты X.509 встречаются в природе, если рассматривать их по расположению в

пищевой

цепочке доверия.

По степени

крутизны

дороговизны и надежности сертификаты делятся на 3 вида:

DVOVEV

Откуда берутся сертификаты?

Еще совсем недавно было всего 2 способа заполучить X.509 сертификат, но времена меняются и с недавнего времени есть и третий путь.

  1. Создать свой собственный сертификат и самому же его подписать. Плюсы — это бесплатно, минусы — сертификат будет принят лишь вами и, в лучшем случае, вашей организацией.

    not trusted

  2. Приобрести сертификат в УЦ. Это будет стоить денег в зависимости от различных его характеристик и возможностей, указанных выше.
  3. Получить бесплатный сертификат LetsEncrypt, доступны только самые простые DV сертификаты.

Для первого сценария достаточно пары команд и чтобы 2 раза не вставать создадим сертификат с алгоритмом эллиптических кривых. Первым шагом нужно создать закрытый ключ. Считается, что шифрование с алгоритмом эллиптических кривых дает больший выхлоп, если измерять в тактах CPU, либо байтах длины ключа. Поддержка ECC не определена однозначно в TLS < 1.2.

openssl ecparam -name secp521r1 -genkey -param_enc explicit -out private-key.pem

Далее, создает CSR — запрос на подписание сертификата.

openssl req -new -sha256 -key private.key -out server.csr -days 730

И подписываем.

openssl x509 -req -sha256 -days 365 -in server.csr -signkey private.key -out public.crt

Результат можно посмотреть командой:

openssl x509 -text -noout -in public.crt

Openssl имеет огромное количество опций и команд. Man страница не очень полезна, справочник удобнее использовать так:

openssl -help
openssl x509 -help
openssl s_client -help

Ровно то же самое можно сделать с помощью java утилиты keytool.

keytool -genkey -keyalg RSA -alias selfsigned -keystore keystore.jks -storepass password -validity 360 -keysize 2048

Следует серия вопросов, чтобы было чем запомнить поля owner и issuer

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?
Is CN=Johnnie Walker, OU=Unknown, O=Unknown, L=Moscow, ST=Moscow, C=RU correct?

Конвертируем связку ключей из проприетарного формата в PKCS12.

keytool -importkeystore -srckeystore keystore.jks -destkeystore keystore.jks -deststoretype pkcs12

Смотрим на результат:

keytool -list -v -alias selfsigned -storepass password -keystore keystore.jks
Alias name: selfsigned
Creation date: 20.01.2021
Entry type: PrivateKeyEntry
Certificate chain length: 1
Certificate[1]:
Owner: CN=Johnnie Walker, OU=Unknown, O=Unknown, L=Moscow, ST=Moscow, C=RU
Issuer: CN=Johnnie Walker, OU=Unknown, O=Unknown, L=Moscow, ST=Moscow, C=RU
Serial number: 1f170cb9
Valid from: Sat Jan 20 18:33:42 MSK 2021 until: Tue Jan 15 18:33:42 MSK 2021
Certificate fingerprints:
     MD5:  B3:E9:92:87:13:71:2D:36:60:AD:B5:1F:24:16:51:05
     SHA1: 26:08:39:19:31:53:C5:43:1E:ED:2E:78:36:43:54:9B:EA:D4:EF:9A
     SHA256: FD:42:C9:6D:F6:2A:F1:A3:BC:24:EA:34:DC:12:02:69:86:39:F1:FC:1B:64:07:FD:E1:02:57:64:D1:55:02:3D

Signature algorithm name: SHA256withRSA
Subject Public Key Algorithm: 2048-bit RSA key
Version: 3

Extensions:

#1: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: 30 95 58 E3 9E 76 1D FB   92 44 9D 95 47 94 E4 97  0.X..v...D..G...
0010: C8 1E F1 92                                        ....
]
]

Значению ObjectId: 2.5.29.14 соответствует определение ASN.1, согласно RFC 3280 оно всегда non-critical. Точно так же можно узнать смысл и возможные значения других ObjectId, которые присутствуют в сертификате X.509.

subjectKeyIdentifier EXTENSION ::= {
    SYNTAX SubjectKeyIdentifier
    IDENTIFIED BY id-ce-subjectKeyIdentifier
}

SubjectKeyIdentifier ::= KeyIdentifier

Подробное объяснение команд gpg

-a вывод ASCII

Выбор функции

Получение ключей

Вы можете получить ключи экземпляра класса KeyStore через его метод getEntry(). Запись хранилища ключей сопоставлена с псевдонимом (alias), который идентифицирует ключ, и защищена паролем ключа. Таким образом, чтобы получить доступ к ключу, вы должны передать псевдоним ключа и пароль методу getEntry(). Вот пример доступа к записи в экземпляре KeyStore:

char[] keyPassword = "789xyz".toCharArray();
KeyStore.ProtectionParameter entryPassword =
        new KeyStore.PasswordProtection(keyPassword);

KeyStore.Entry keyEntry = keyStore3.getEntry("keyAlias", entryPassword);

Если вы знаете, что запись, к которой вы хотите получить доступ, является закрытым ключом, вы можете преобразовать экземпляр KeyStore.Entry в KeyStore.PrivateKeyEntry. Вот как это выглядит:

KeyStore.PrivateKeyEntry privateKeyEntry = (KeyStore.PrivateKeyEntry)
        keyStore3.getEntry("keyAlias", entryPassword);

После приведения к KeyStore.PrivateKeyEntry вы можете получить доступ к закрытому ключу, сертификату и цепочке сертификатов с помощью следующих методов:

Помещение ключей в хранилище

Вы также можете поместить ключи в экземпляр класса KeyStore. Пример помещения секретного ключа (симметричного ключа) в экземпляр KeyStore:

SecretKey secretKey = getSecretKey();
KeyStore.SecretKeyEntry secretKeyEntry = new KeyStore.SecretKeyEntry(secretKey);

keyStore3.setEntry("keyAlias2", secretKeyEntry, entryPassword);

Проверка контрольной суммы сертификата

Данная команда выводит список контрольных сумм всех сертификатов хранилища (keystore.jks) с соответствующими псевдонимами.

keytool -list -keystore keystore.jks

При этом будет запрошен пароль хранилища. Кроме того, можно ограничить вывод до определенного псевдонима с помощью опции -alias domain (где domain  – нужный псевдоним).

Просмотр записей хранилища ключей

В данном разделе речь пойдет о содержимом Java Keystore, а именно о просмотре информации сертификата и экспортировании сертификатов.

Пятерка, pgp

PGP – это коммерческая версия стандарта OpenPGP с закрытым исходным кодом. pgp предоставляет графические инструменты и инструменты командной строки. Работа с командной строкой в ​​основном включает следующее:

  • pgpk.exe Создание ключей и управление ими
  • pgpe.exe шифрование
  • подпись pgps.exe
  • pgpv.exe Расшифровка и проверка
  • pgpo.exe имитирует режим командной строки старой версии 2.6.3

Редактирование хранилища ключей

Данный раздел охватывает редактирование  записей Java Keystore (например, удаление и изменение псевдонимов).

Словарный запас

Определение X.509 сертификатов есть в архиве ITU-T

Certificate  ::=  SEQUENCE  {
     tbsCertificate       TBSCertificate,
     signatureAlgorithm   AlgorithmIdentifier,
     signatureValue       BIT STRING  }

TBSCertificate  ::=  SEQUENCE  {
     version         [0]  EXPLICIT Version DEFAULT v1,
     serialNumber         CertificateSerialNumber,
     signature            AlgorithmIdentifier,
     issuer               Name,
     validity             Validity,
     subject              Name,
     subjectPublicKeyInfo SubjectPublicKeyInfo,
     issuerUniqueID  [1]  IMPLICIT UniqueIdentifier OPTIONAL,
                          -- If present, version MUST be v2 or v3

Для того, чтобы досконально понять обозначения и синтаксис, придется читать спеки X.680 редакции 2008 г., где есть полное описание ASN.1. В понятиях ASN.1SEQUENCE обозначает примерно то же самое, что и struct в Си. Это может сбить с толку, ведь по семантике оно должно было соответствовать скорее массиву. И тем не менее.

Про сертификаты:  Сертификаты CFA vs CIMA vs ACCA. Что выбрать? - Блог SF Education

Стандарт X.690 определяет следующие правила кодирования структур данных, созданных в соответствии с ASN.1: BER (Basic Encoding Rules), CER (Canonical Encoding Rules), DER (Distinguished Encoding Rules). Есть даже XER (XML Encoding Rules), который на практике мне никогда не встречался.

Да, но для чего нужны сертификаты X.509, которые доставляют столько головной боли? Первая и основная функция сертификатов X.509 — служить хранилищем открытого или публичного ключа PKI (public key infrastructure). К этой функции нареканий нет, а вот со второй не все так однозначно.

Вторая функция сертификатов X.509 заключается в том, чтобы предъявитель сего был принят человеком, либо программой в качестве истинного владельца некоего цифрового актива: доменного имени, веб сайта и пр. Это получается по-разному, далеко не все сертификаты имеют высокую ликвидность, если пользоваться финансовой терминологией.

Создание csr для существующего закрытого ключа

Чтобы сгенерировать запрос на подпись сертификата, который можно отправить в ЦС  для получения надежного SSL-сертификата, следуйте данному разделу руководства. Для этого понадобятся уже существующее хранилище ключей и псевдоним.

Данная команда создаст CSR (domain.csr), подписанный закрытым ключом с псевдонимом domain в хранилище keystore.jks:

keytool -certreq -alias domain -file domain.csr -keystore keystore.jks

Введите пароль хранилища ключей, после чего запрос будет создан.

Создание и импортирование записей

Данный раздел посвящен командам Java Keytool, которые создают пары ключей и сертификатов, а также импортируют сертификаты.

Создание хранилища ключей

Вы можете создать экземпляр KeyStore, вызвав его метод getInstance(). Вот пример создания экземпляра класса:

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

В этом примере создается экземпляр KeyStore по умолчанию. Также можно создавать экземпляры KeyStore с другим форматом хранения ключа, передавая параметр в метод getInstance(). Например создание экземпляра хранилища ключей PKCS12:

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

Сценарий №1 — найти следующего в связке

Связка сертификатов — Объединение нескольких X.509 сертификатов в один файл, чаще всего в формате PEM. Связка передается по сети в момент протокола рукопожатия SSL/TLS.

Самый сок начинается, когда имеете дело со связкой сертификатов, a. k. a certificate chain. Часто просматривая лапшу в связке ключей jks непросто понять как найти родительский сертификат, когда там россыпь новых и старых сертификатов на несколько доменных имен.

Удаление псевдонима

Данная команда удалит псевдоним domain из хранилища keystore.jks:

keytool -delete -alias domain -keystore keystore.jks

Укажите пароль хранилища.

Файл p7b / pkcs # 7 (pem)

Содержит строку «—–BEGIN PKCS—–» & «—–END PKCS7—–», в которой могут храниться только сертификаты и сертификаты цепочки, но не закрытые ключи. Контент закодирован в Base64, а расширение может быть .p7b, .p7c.

Файл pfx / pkcs # 12 (pem)

Файлы, которые могут быть зашифрованы, несколько сертификатов или ключей могут храниться в одном файле, который в основном используется для импорта и экспорта сертификатов и закрытых ключей. Расширение обычно .pfx, .p12.

PEM в DER

 openssl x509 -outform der -in certificate.pem -out certificate.der

Сертификат формата PEM для P7B

 openssl crl2pkcs7 -nocrl -certfile certificate.cer -out certificate.p7b -certfileCAcert.cer

Формат PEM в PFX

 openssl pkcs12 -export -out certificate.pfx -inkey privateKey.key -in certificate.crt-certfile CAcert.crt

DER в PEM

openssl x509 -inform der -in certificate.cer -out certificate.pem

P7B в PEM

openssl pkcs7 -print_certs -in certificate.p7b -out certificate.cer

P7B в PFX (сначала в PEM)

$ openssl pkcs7 -print_certs -in certificate.p7b -out certificate.cer$ openssl pkcs12 -export -in certificate.cer -inkey privateKey.key -outcertificate.pfx -certfile CAcert.cer

PFX в PEM (весь контент в PFX хранится в файле формата pem)

openssl pkcs12 -in certificate.pfx -out certificate.cer -nodes

PKCS # 8 определяет синтаксис информации о закрытом ключе и синтаксис закрытого ключа шифрования. X509 определяет спецификации сертификата. Ключи обычно кодируются и хранятся с использованием DER и PEM. JCE в Java использует DER. OpenSSL в основном использует кодировку PEM.

Многие открытые ключи SSH используют формат openssh. Контент начинается с ssh-rsa, заканчивается RSA-1024, а средний – кодировкой Base64:

ssh-rsa  AAAAB3Nza…………………….cySYqQ==  RSA-1024

Формат der

В основном используется в Java, все типы сертификатов и закрытых ключей могут храниться в формате DER. Двоичные данные хранятся непосредственно в файле без кодировки Base64 и без читаемого текста описания. Расширение может быть .cer, .der.

Формат pem (pkcs # 8)

pem – это наиболее часто используемый формат хранения закрытых ключей и сертификатов. Который обычно содержит строки «—— BEGIN XXXX——» и «——END XXXX——» с двоичными данными в кодировке Base64, хранящимися в середине. В одном файле могут содержаться несколько сертификатов PEM или закрытых ключей, но большинство из них лучше хранить каждый сертификат и закрытый ключ отдельно, расширение может быть .pem, .crt, .cer, .key.

Хранение

Иногда вы можете захотеть сохранить хранилище ключей на какое-либо хранилище (диск, база данных и т. д.), чтобы вы могли загрузить его снова в другой раз. Экземпляр класса KeyStore сохраняется вызовом метода store(). Пример:

char[] keyStorePassword = "123abc".toCharArray();
try (FileOutputStream keyStoreOutputStream = new FileOutputStream("data/keystore.ks")) {
    keyStore3.store(keyStoreOutputStream, keyStorePassword);
}

Хранилище ключей

Java KeyStore — это хранилище ключей в виде базы данных, представленное классом KeyStore (java.security.KeyStore). Хранилище можно записать на диск и снова прочитать, оно может быть защищено паролем, а каждая запись ключа в хранилище ключей может быть защищена собственным паролем, что делает класс KeyStore полезным механизмом для безопасной работы с ключами шифрования. Хранилище ключей может содержать ключи следующих типов:

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

Четыре, gpg

Сначала разберитесь в следующих трех концепциях:

  • OpenPGPЭто стандарт и протокол шифрования (RFC4880).
  • PGP(Pretty Good Privacy) – коммерческая реализация этого стандарта с закрытым исходным кодом.
  • GPG(GnuPG) – это реализация этого стандарта с открытым исходным кодом.

Видно, что PGP и GPG – два независимых инструмента, основанных на одном стандарте, которые могут обрабатывать шифрование, дешифрование, подпись и другие функции.GPG является бесплатным и открытым исходным кодом.

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

Данная команда экспортирует бинарный DER-зашифрованный сертификат (domain.der) с псевдонимом (domain) в хранилище (keystore.jks):

keytool -exportcert-alias domain-file domain.der-keystore keystore.jks

Укажите пароль хранилища ключей.

Генерация ключей (genrsa, genpkey, req генерировать ключи одновременно с запросом сертификата, gendh, gendsa)

(1) openssl genrsa [options] [bits_num]    

  • -out <file> Укажите выходной файл, если не указан, отобразите ключевой контент на терминале
  • -passout pass:<password> Установите пароль файла закрытого ключа
  • -f4 Использовать F4 (0x10001) как параметр E открытого ключа (по умолчанию)
  • -3 Используйте 3 в качестве параметра E открытого ключа
  • -des, -des3, -aes128, -aes192, -aes256 Указать алгоритм шифрования (по умолчанию не шифруется)

Формат ключа по умолчанию – PEM.openssl по умолчанию генерирует только файл закрытого ключа, Используйте команду rsa, когда вам нужно извлечь открытый ключ.

пример

# Создайте пару ключей RSA. Длина в битах составляет 2048 и хранится в файле rsakey0.pem.
openssl genrsa -out rsakey0.pem 2048
# Создайте пару ключей RSA. Используйте шифрование DES3, ключ защищен паролем, длина в битах - 1024 openssl genrsa
-des3 -out rootca.key -passout pass:1234561024

(2) openssl genpkey [options]   v1.0.1

пример

# Создать ключ RSA, длина в битах 2048, формат DER
openssl genpkey -algorithm RSA -out rsapriKey.pem -pkeyopt rsa_keygen_bits:2048 -outform DER

(3) Создание новой пары ключей по запросу openssl req

openssl req -x509  -days 365 -newkey rsa:2048 -keyout private.pem -out public.pem -nodes

Итоги

Данное руководство описывает большинство операций, которые выполняются при управлении Java Keystores. Конечно, охватить все функции в одной статье невозможно. Но зная базовые команды, можно самостоятельно поэкспериментировать с управлением хранилищами.

Данное руководство основано на версии хранилища ключей, которое поставляется с Java 1.7.0. чтобы установить Java, читайте данную статью.

Tags:

Оцените статью
Мой сертификат
Добавить комментарий