Создание сертификатов при помощи OpenSSL
#OpenSSL является библиотекой по работе с криптографией, но в этой статье я затрону только часть функций этого инструмента, а именно создание само-подписанных сертификатов.
Создание центра сертификации
При помощи корневого сертификата, мы будем подписывать сертификаты клиентские. Создаём сертификат центра сертификации…
Где:
-days '3650'
- количество дней, по прошествии которого сертификат центра сертификации станет недействительным.'_CA.key'
- название создаваемого файла с ключом центра сертификации.'_CA.crt'
- название создаваемого файла с сертификатом центра сертификации.
Создание клиентского сертификата
Как только будет готов корневой сертификат, можно приступать к выпуску клиентских сертификатов.
Создание приватного ключа
Для начала создаём приватный ключ.
Где:
-out 'client.key'
- название создаваемого файла с клиентским приватным ключом.
Создание запроса на подпись сертификата
Выполняем запрос на сертификат.
Где:
-key 'client.key'
- файл с приватным ключом клиентского сертификата.-out 'client.csr'
- название создаваемого файла с запросом на подпись клиентского сертификата.
При выполнении запроса будет предложено ввести актуальные данные для будущего сертификата:
Country Name (2 letter code)
- двухбуквенный код страны, в которой юридически находится ваша организация.State or Province Name (full name)
- штат или провинция, в которой юридически находится ваша организация.Locality Name (e.g., city)
- город, в котором юридически находится ваша организация.Organization Name (e.g., company)
- юридически зарегистрированное название вашей организации.Organizational Unit Name (e.g., section)
- название вашего отдела в организации (опционально).Common Name (e.g., server FQDN)
- полное доменное имя (FQDN) (например, www.example.org).Email Address
- ваш адрес email (опционально).A challenge password
- пароль (опционально).An optional company name
- необязательное название компании (опционально).
Самое главное поле это Common Name (e.g., server FQDN)
(CN
), заполнять его необходимо очень внимательно.
Создание и подпись сертификата
В заключительной части остаётся только создать сам сертификат и подписать его.
Где:
-in 'client.csr'
- файл с запросом клиентского сертификата.-CA '_CA.crt'
- файл с сертификатом центра сертификации.-CAkey '_CA.key'
- файл с ключом центра сертификации.-days '3650'
- количество дней, по прошествии которого клиентский сертификат станет недействительным.-out 'client.crt'
- название создаваемого файла с клиентским сертификатом.
Экспорт сертификата
Для того, чтобы импортировать сертификат на клиентские устройства, его необходимо экспортировать в формат P12
. P12
является контейнером, в котором содержится приватный ключ сертификата и сам сертификат.
Где:
-inkey 'client.key'
- файл с приватным клиентским ключом.-in 'client.crt'
- файл с клиентским сертификатом.-out 'client.p12'
- название создаваемого файла-контейнера с приватным ключом и сертификатом.
Верификация сертификата
-CAfile '_CA.crt'
- файл с сертификатом центра сертификации.'client.crt'
- файл с клиентским сертификатом.
Просмотр сертификата
Где:
-in 'client.crt'
- файл с клиентским сертификатом.
При выполнении команды, терминал покажет информацию со всеми основными сведениями о сертификате (пример ниже).
|
|
Просмотр запроса на подпись сертификата
Где:
-in 'client.csr'
- файл с запросом на подпись клиентского сертификата.
Команда выдаст информацию по запросу на подпись клиентского сертификата (пример ниже).
|
|
Автоматизация
Команд много. Поэтому я как обычно, решил всё автоматизировать и загнать в скрипт.
Скрипт содержит две функции, вызывать которых можно по отдельности. Функция ca()
позволяет сгенерировать ключ и сертификат центра сертификации, а функция cert()
, соответственно, генерирует клиентские сертификаты.
Использование
- Создать ключ и сертификат центра сертификации:
- Создать клиентские ключи и сертификаты:
Немного расскажу про алгоритм генерации сертификатов.
- У сертификата есть поле
Serial Number
, которое содержит серийный номер сертификата. Серийный номер сертификата это уникальный номер, выданный центром сертификации. В моём скрипте при генерации клиентского сертификата указаны опции-CAcreateserial
и-CAserial "${srl}"
, которые позволяют OpenSSL создавать рядом с клиентскими сертификатами файлы формата.slr
, содержащие в себе серийные номера сгенерированных сертификатов. Таким образом можно создавать небольшую локальную базу данных выданных сертификатов. - Файл каждого клиентского сертификата генерируется с названием вида
[TS].[SFX].[EXE]
, где[TS]
- это временная метка в микросекундах,[SFX]
- числовой суффикс, а[EXE]
- расширение файлов.
На этом всё. Не исключаю факта присутствия ошибок или неточностей. Если что, жду предложения в электронную почту. 😄
Быстрое создание само-подписанного сертификата
Для быстрого создания само-подписанного сертификата, я написал небольшой скрипт. Настройки скрипта необходимо адаптировать под себя.
Скрипт
Генератор корректных SSL-сертификатов. Перед генерацией сертификата, необходимо откорректировать переменные в скрипте под проект.
Использование
Скрипт можно удалённо запросить из репозитория или запустить локально на хосте. Скрипт принимает следующие параметры согласно очерёдности:
CN
- CN (Common Name).subjectAltName
- subjectAltName (Alternative Name).keyUsage
- использование ключа (key usage extension).digitalSignature
nonRepudiation
keyEncipherment
dataEncipherment
keyAgreement
keyCertSign
cRLSign
encipherOnly
decipherOnly
extendedKeyUsage
- расширенное использование ключа (extended key usage).serverAuth
- SSL/TLS WWW Server Authentication.clientAuth
- SSL/TLS WWW Client Authentication.codeSigning
- Code Signing.emailProtection
- E-mail Protection (S/MIME).timeStamping
- Trusted Timestamping.OCSPSigning
- OCSP Signing.ipsecIKE
- ipsec Internet Key Exchange.msCodeInd
- Microsoft Individual Code Signing (authenticode).msCodeCom
- Microsoft Commercial Code Signing (authenticode).msCTLSign
- Microsoft Trust List Signing.msEFS
- Microsoft Encrypted File System.
[TRUE|FALSE]
- является ли сертификат сертификатом центра сертификации и можно ли при помощи него заверять другие сертификаты. Параметр принимает значениеTRUE
илиFALSE
. По умолчаниюFALSE
.
Удалённый запрос скрипта
В терминале выполнить команду, подставив свои значения:
Например:
|
|
|
|
Таким образом, сертификат будет сгенерирован с заданными параметрами и заверен собственной подписью.
Создание PFX
Чтобы создать PFX-файл, необходимо выполнить следующую команду:
Где:
f
- переменная, содержащая общее название файлов.
2024-11-06
- Обновлены скрипты.
2024-07-07
- Удалены две команды по быстрой генерации само-подписанных сертификатов. Они заменены одним скриптом.
- Обновлены скрипты.
2024-04-07
- Добавлены команды для быстрой генерации сертификата без создания CA.
- Добавлен скрипт для быстрой генерации сертификата без создания CA.
2023-11-08
bash.openssh.ca.sh
: добавление проверки на запуск скрипта под root’ом.bash.openssh.ca.sh
: добавление комментариев.