Криптография
July 6, 2022

Выпуск электронного сертификата

Предисловие

Мне очень не хватало единого ресурса со сборником айтишных рецептов. Как baeldung.com, но не только по программированию. Попробую писать их в своём блоге.

Основные понятия

Ключ

Ключом в криптографии называют фрагмент информации (обычно строка из чисел и букв), который передаётся в криптографический алгоритм для шифрования/дешифрования и подписи/проверки данных.

Ключевая пара

Приватный и публичный ключ, которые работают в паре: приватный расшифровывает данные, зашифрованные публичным напарником.

Приватный ключ

Известен только владельцу. Используется для расшифровки или подписи данных.

Публичный ключ

Доступен всем. Используется для шифрования данных или проверки подписи.

Запрос на сертификат

Создаётся владельцем и является основанием для выпуска сертификата.

Состоит из трёх основных частей: информация о сертификате (в X.509 формате), идентификатор алгоритма подписи и цифровая подпись информации о сертификате. Первая часть состоит из информации о подписанте, включает публичный ключ. Подпись первой части защищает от подмены публичного ключа.

Генерация ключевой пары

Для генерации ключевой пары используется утилита openssl.

Пример команды для генерации ключевой пары в PEM формате:

openssl genrsa -out private.pem 2048

Команда генерирует 2048-битную RSA ключевую пару и записывает её в файл.

Почему расширение файла не .key? Расширение в данном случае в программном плане не играет никакой роли, оно нужно только для человека. Допустимы оба варианта: и .pem и .key.

Пример файла:

-----BEGIN RSA PRIVATE KEY-----
MIIEpQIBAAKCAQEArQteMabkeSWxnyZ1Lt5H24AMObIlgC48CfeguLv9AZUq2GbV
01BR9hyM4F9g0MmgicQp/EvZrU9KPuKOcNxWlgsfJLNn36/a/5qaJm53tqRlqQvd
CQ5FTramrB1ALd5/jx6s0kG0Q2mYQTRvwdUyAuZg9dzBE/bFaUGBIQe3ZZUs1Xh1
HkM2zYo/xOG/ZUsvJDTWZ9OEECc22Jdk1ZZ3cED9WzWc3RHypmZ8We7ZWa9jzSdY
bWYqB6lFchlPTP5q4IQ9qMZjWDmTp+Bb5Pe4T96GoUI+Nh7tXCgVQPcBwzk1Mwid
PA6nwHdYQavR/W5tFifEPvXX32g3vRXZeuaKYwIDAQABAoIBAQCcXW1cSIajwh/i
xAmXtFwSSH7Dk+q3DRBLoWumApj42SXCLgqBzE6DqgDSrtz5TXi3hH678H5eUQuy
D17PNQs4wgv+Se9O/cVSuw0YNTIP5DXIr2OoTzDpk7rARB4+VJPHa9yWkbCmScC/
CvcBm/h5DlwHTtdZht+T4REiG6rpKoo4SjEFsQX8ssB7cNgfs+3vpQJSAgN65AGT
PEOGYFo/hDRAkTgeXlvYPbe1SPQl65S+3Cvd60dLk+1yjU/CjSlvy9R5WJ0mML5G
tY1f8zc/3dsVXntA6Q2SVsiCyW1XITAgt51CyJgjNM7cYytm8eELlPvP40YQHCQx
FEOt3zCBAoGBAN8Fv+ILxePO+Rk+p9C97+edE+8/guSHR7wOPZhwuHeLMm+f7eg3
7lbgPg1JpYJSLErp6+V5Yx/RkNnJR4evtpTd43uQL0janbasFCd3N2WcEghKKsod
XW0NcNmtW8v6+9T02J+rMoiVpk3FC19tHlkfRP5ySFTjYyKa3bKMkVpzAoGBAMah
wi7RHnb0BBlWuI84RqkxG6wlX7q/XE391jc+aVlGXNDWHC4aH1Pzjv1b/FFPjKpH
6pmFeKavx1qQlQrK0oN060QSIsXn8W/F6xHW3QwxFoFndblMu487jic3vuYrf8LU
n85H2OkC4vIrfIi44+uDbAjr0tpPGIRP/OQXHGRRAoGBAIjT7jWxI2fww8NJPYxD
+7wOEvzl6lhq5wfpdMDh50rwi7EQXdXq+r8yNN/SH0klQSd0/NV88+PBnyz+4HPO
yiXrPHXCsD/yYHCCgprz+XjNmAKd/kKiYX9Wj7X9NiSfh4HP9ld/oTFLHwz3p1KU
j9n95UZ2twnduCSy/vFcbJEhAoGBAJSxWs/5M7kQilD9nkN4eU0GuhRwFe2SeuLX
dpj8W5i9F5Yt8gKBA5qw5QW86nFj/4UpOPGb/OmrBK1DNo9Rra1CxSu799P3AcIO
gx5jni4WQSa18Ga6jl12079/96QORCHxUX/2QOaNhp6K9zrSTaxsQV+cScerFktW
JZYJxvNBAoGAVByWvsh4BwddziqiItLrM34WiJNNhGNfPwgvo8LH+S4/en6e17nx
MgU1rKMGXqsHbkMWD1U6FgQUnmkUb2Ek/M/OP0eqpbHe9yHQQrhJjzdbhZYfOD1I
6LdQy214uInozOztviWa/qw5RglrGy56B00Az14FPi7vDaAp/N6xhVE=
-----END RSA PRIVATE KEY-----

Ключевую пару можно зашифровать при помощи пароля одним из алгоритмов, указав один из параметров команды: -aes128|-aes192|-aes256|-camellia128|-camellia192|-camellia256|-des|-des3|-idea.

openssl genrsa -des3 -out private.pem 2048

Пароль будет запрошен в интерактивном режиме.

Пароль можно указать прямо в команде:

openssl genrsa -des -passout pass:1234 -out private.pem 2048

Или взять из файла:

openssl genrsa -des -passout file:passphrase.txt -out private.pem 2048

Извлечение публичного ключа

Команда для извлечения из пары публичного ключа:

openssl rsa -in private.pem -outform PEM -pubout -out public.pem

В параметре -in указывается файл с ключевой парой, в параметре -outform указывается формат экспортируемого ключа, в параметре -out передаётся имя файла, в который будет экспортирован публичный ключ.

Пример файла:

-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArQteMabkeSWxnyZ1Lt5H
24AMObIlgC48CfeguLv9AZUq2GbV01BR9hyM4F9g0MmgicQp/EvZrU9KPuKOcNxW
lgsfJLNn36/a/5qaJm53tqRlqQvdCQ5FTramrB1ALd5/jx6s0kG0Q2mYQTRvwdUy
AuZg9dzBE/bFaUGBIQe3ZZUs1Xh1HkM2zYo/xOG/ZUsvJDTWZ9OEECc22Jdk1ZZ3
cED9WzWc3RHypmZ8We7ZWa9jzSdYbWYqB6lFchlPTP5q4IQ9qMZjWDmTp+Bb5Pe4
T96GoUI+Nh7tXCgVQPcBwzk1MwidPA6nwHdYQavR/W5tFifEPvXX32g3vRXZeuaK
YwIDAQAB
-----END PUBLIC KEY-----

Создание запроса на сертификат

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

Интерактивный режим

Команда для создания запроса на сертификат:

openssl req -new -key private.pem -out codebook.csr

Параметр -new необходим для создания нового запроса на сертификат, в параметре -key указывается ключевая пара, в параметре -out задаётся имя файла, в который будет записан запрос на выпуск сертификата.

Введённая команда будет в интерактивном режиме запрашивать информацию о подписанте (владельце):

Country Name (2 letter code) [AU]: RU
State or Province Name (full name) [Some-State]: Saint-Petersburg
Locality Name (eg, city) []: Saint-Petersburg
Organization Name (eg, company) [Internet Widgits Pty Ltd]: Codebook
Organizational Unit Name (eg, section) []: Study
Common Name (e.g. server FQDN or YOUR name) []: Ivan Volynkin
Email Address []: mail@ivolynkin.ru

После уточнения всех данных будет сформирован запрос на выпуск сертификата и записан в файл codebook.csr.

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

Аналогичный результат, но без интерактивного режима, можно получить, указав параметр -subj:

openssl req -new -key private.pem -subj '/C=RU/ST=Saint-Petersburg/L=Saint-Petersburg/O=Codebook/OU=Study/CN=Ivan Volynkin/emailAddress=mail@ivolynkin.ru' -out codebook.csr

Создание запроса на сертификат и ключевой пары одной командой

openssl req -new -newkey rsa:2048 -nodes -keyout private.pem -subj '/C=RU/ST=Saint-Petersburg/L=Saint-Petersburg/O=Codebook/OU=Study/CN=Ivan Volynkin/emailAddress=mail@ivolynkin.ru' -out codebook.csr

Параметр -newkey указывает на необходимость создания ключевой пары, rsa:2048 — 2048-битный RSA ключ, -nodes отменяет режим пароля в ключевой паре, в -keyout указывается имя файла, в который будет записана ключевая пара.

Выпуск сертификата

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

Выпуск сертификата удостоверяющим центром

У удостоверяющего центра должны быть собственные сертификат и ключевая пара.

Удостоверяющий центр может выпустить сертификат командой:

openssl x509 -CA ca.crt -CAkey ca.pem -CAcreateserial -signkey private.pem -in codebook.csr -req -days 365 -out codebook.crt

В параметре -CA указывается сертификат УЦ, в -CAkey указывается приватный ключ УЦ, в -signkey — приватный ключ выпускаемого сертификата, в -in — запрос на сертификат, в -days — количество дней активности сертификата, в -out имя файла, в который будет записан сертификат.

В результате будет выпущен сертификат, подписанный сертификатом УЦ.

Самоподписанный сертификат

openssl x509 -signkey private.pem -in codebook.csr -req -days 365 -out codebook.crt

В результате будет выпущен самоподписанный сертификат.