Выпуск электронного сертификата
Предисловие
Мне очень не хватало единого ресурса со сборником айтишных рецептов. Как 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