Как сгенерировать самоподписанный корневой сертификат TLS
Команды для создания пары ключей (приватного и публичного) и самоподписанного сертификата с использованием OpenSSL:
1 2 |
openssl genpkey -algorithm RSA -out ca.key -pkeyopt rsa_keygen_bits:4096 openssl req -x509 -new -key ca.key -out ca.crt -days 3650 -config openssl.cnf |
1. Генерация приватного ключа (RSA)
1 2 |
openssl genpkey -algorithm RSA -out ca.key -pkeyopt rsa_keygen_bits:4096 |
Разбор команды:
openssl genpkey
: Указывает OpenSSL сгенерировать новую пару ключей (приватный и публичный).-algorithm RSA
: Указывает, что ключ должен быть сгенерирован с использованием алгоритма RSA (одного из самых популярных алгоритмов для криптографических ключей).-out ca.key
: Указывает, что приватный ключ должен быть сохранён в файл с именемca.key
.-pkeyopt rsa_keygen_bits:4096
: Это дополнительная опция, которая задаёт длину ключа RSA — 4096 бит. Чем больше длина ключа, тем безопаснее, но тем больше ресурсов требуется для шифрования и расшифровки. Длина 4096 бит считается высокой степенью защиты.
Что происходит:
- Генерируется новый приватный RSA-ключ длиной 4096 бит.
- Ключ сохраняется в файл
ca.key
. Этот ключ можно использовать для создания и подписи сертификатов.
2. Создание самоподписанного сертификата (CA-сертификат)
1 2 |
openssl req -x509 -new -key ca.key -out ca.crt -days 3650 -config openssl.cnf |
Разбор команды:
openssl req
: Команда для создания запроса на сертификат (CSR) или сертификата.-x509
: Указывает, что вместо CSR будет создан самоподписанный сертификат X.509. Сертификат X.509 используется для обеспечения подлинности и безопасности соединений, и это наиболее распространённый стандарт для сертификатов TLS/SSL.-new
: Указывает, что создаётся новый сертификат.-key ca.key
: Приватный ключ, который используется для подписания сертификата. Здесь используется ранее сгенерированный ключ (ca.key
).-out ca.crt
: Указывает файл, в который будет сохранён созданный самоподписанный сертификат. В данном случае этоca.crt
.-days 3650
: Указывает срок действия сертификата в днях. В этом случае сертификат будет действителен 3650 дней (около 10 лет).-config openssl.cnf
: Указывает файл конфигурацииopenssl.cnf
, который содержит дополнительные параметры для сертификата (например, информацию о субъекте, расширения сертификата, такие какkeyUsage
,basicConstraints
и т.д.).
Что происходит:
- Создаётся новый самоподписанный сертификат X.509, который действует как корневой сертификат (CA-сертификат).
- Сертификат подписывается приватным ключом, указанным в
ca.key
. - Сертификат сохраняется в файл
ca.crt
. - Сертификат будет действителен в течение 10 лет (3650 дней).
Этот сертификат можно использовать как корневой для подписи других сертификатов.
Файл конфига openssl.cnf
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
[ req ] default_bits = 4096 # Размер ключа (2048 или больше) prompt = no # Отключение интерактивного режима default_md = sha256 # Хеш-функция distinguished_name = dn # Раздел с общими сведениями x509_extensions = v3_ca [ dn ] C = RU # Страна (например, US, RU) ST = Moscow # Штат/область L = Moscow # Город O = MPMSystem # Организация OU = IT Department # Отдел CN = Root CA # Common name [ v3_ca ] subjectKeyIdentifier = hash authorityKeyIdentifier = keyid:always,issuer:always basicConstraints = critical,CA:TRUE,pathlen:0 keyUsage = critical, keyCertSign, digitalSignature, cRLSign |
Этот конфигурационный файл OpenSSL используется для создания самоподписанного сертификата. Давайте подробно рассмотрим, что делают каждая из его секций и параметры.
1. Секция [ req ]
Секция [ req ]
содержит параметры, которые определяют поведение команды openssl req
при создании запроса на сертификат (CSR) или сертификата.
default_bits = 4096
: Устанавливает длину ключа по умолчанию в 4096 бит. Это стандартный размер ключа, который обеспечивает высокую степень безопасности.prompt = no
: Отключает интерактивный режим. Без этого параметра OpenSSL запросил бы ввод данных о стране, организации и других полях. При отключении интерактивного режима данные берутся из раздела[ dn ]
.default_md = sha256
: Указывает хеш-функцию по умолчанию, которая будет использоваться для подписи сертификата.sha256
является современной и надёжной функцией хеширования, широко используемой в криптографических операциях.distinguished_name = dn
: Указывает, что данные для полей, таких как страна, организация и т.д., будут взяты из секции[ dn ]
.x509_extensions = v3_ca
: Указывает, что для сертификата будут применены расширения из секции[ v3_ca ]
. Эти расширения делают сертификат пригодным для использования в качестве корневого сертификата (CA-сертификата).
2. Секция [ dn ]
Секция [ dn ]
содержит данные, которые будут включены в CSR или сертификат. Это «различительные» поля (distinguished name), которые идентифицируют владельца сертификата.
C = RU
: Страна владельца сертификата, в данном случае Россия (RU
).ST = Moscow
: Штат или область, в данном случае — Москва.L = Moscow
: Город владельца сертификата — также Москва.O = MPMSystem
: Организация, в данном случае MPMSystem.OU = IT Department
: Организационная единица (отдел), в данном случае — IT Department.CN = Root CA
: Common Name (CN), который используется для идентификации сертификата. В данном случае этоRoot CA
, что указывает, что данный сертификат будет корневым центром сертификации.
3. Секция [ v3_ca ]
Секция [ v3_ca ]
содержит расширения X.509, которые будут добавлены к сертификату. Эти расширения необходимы для создания сертификата CA, который может подписывать другие сертификаты.
subjectKeyIdentifier = hash
: Добавляет идентификатор открытого ключа (Subject Key Identifier) на основе хеша открытого ключа этого сертификата. Этот параметр помогает различать сертификаты по их открытым ключам.authorityKeyIdentifier = keyid:always,issuer:always
: Этот параметр указывает, что сертификат будет содержать идентификатор ключа, используемого для подписи (Authority Key Identifier). В данном случае указывается, что идентификатор ключа будет включать какkeyid
(идентификатор ключа), так иissuer
(данные издателя), что помогает связывать сертификаты с их авторитетом (CA).basicConstraints = critical,CA:TRUE,pathlen:0
: Это расширение указывает, что сертификат является CA (сертификатом центра сертификации). ПараметрCA:TRUE
указывает, что сертификат может подписывать другие сертификаты. Флагcritical
делает это расширение обязательным для проверки, и если программа не поддерживает это расширение, она отклонит сертификат.pathlen:0
указывает, что этот CA-сертификат может подписывать только конечные сертификаты (не другие CA), ограничивая «глубину» цепочки сертификатов.keyUsage = critical, keyCertSign, digitalSignature, cRLSign
: Это расширение указывает, для чего можно использовать ключ. Флагcritical
снова означает, что это обязательное расширение.keyCertSign
: Сертификат может быть использован для подписи других сертификатов.digitalSignature
: Сертификат может быть использован для цифровой подписи.cRLSign
: Сертификат может использоваться для подписывания списков отзыва сертификатов (CRL, Certificate Revocation List).
Резюме
Этот конфигурационный файл создаёт самоподписанный сертификат центра сертификации (CA), который может использоваться для подписи других сертификатов. Он включает важные криптографические расширения и настройки, которые делают его полноценным CA-сертификатом с возможностью подписывать конечные сертификаты.
Recommended Posts
Golang: генерация сертификатов с собственным корневым сертификатом для использования mTLS для работы микросервисов
27.03.2024
jq — инструмент для обработки JSON-данных
28.02.2024
Vault как настроить доступ извне?
27.02.2024