Создание сертификатов при помощи 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).digitalSignaturenonRepudiationkeyEnciphermentdataEnciphermentkeyAgreementkeyCertSigncRLSignencipherOnlydecipherOnly
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: добавление комментариев.