14 сентября, 2023

Создание сертификатов при помощи OpenSSL в Windows

Предисловие

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

Используемое программное обеспечение:

  • Windows 10 x64
  • OpenSSL 3.1

Для целей, поставленных в этой статье, версия OpenSSL роли не играет. Можно поставить версию 3.0 или 1.1.1 - будет отличаться только путь к файлу openssl.exe.

Установка OpenSSL

Скачайте и установите OpenSSL для Windows. В данной статье используется FireDaemon OpenSSL (https://www.firedaemon.com/download-firedaemon-openssl). Другие дистрибутивы можете найти по ссылке: https://wiki.openssl.org/index.php/Binaries.

Рекомендуем использовать установщик EXE как самый простой вариант, но он есть только для версии 3.1. Другие версии придется устанавливать вручную из ZIP архива.

При установке из ZIP поместите файлы из папок SSL, X64, X86 по определенному пути, иначе не будет работать. Расположение файлов можно посмотреть в выводе команды конкретной версии:

openssl.exe version -a
Для установки OpenSSL версии 1.1.1 в Windows x64 копируем из ZIP архива содержимое папок:

  • ssl\*.* → C:\Program Files\Common Files\FireDaemon SSL\*.*
  • x64\*.* → C:\Program Files\FireDaemon OpenSSL\*.*
  • x86\*.* → C:\Program Files (x86)\FireDaemon OpenSSL\*.*

Для OpenSSL 3.0 пути будут такие:

  • ssl\*.* → C:\Program Files\Common Files\FireDaemon SSL 3.0\*.*
  • x64\*.* → C:\Program Files\FireDaemon OpenSSL 3.0\*.*
  • x86\*.* → C:\Program Files (x86)\FireDaemon OpenSSL 3.0\*.*

Если используете OpenSSL 3.1, тогда:

  • ssl\*.* → C:\Program Files\Common Files\FireDaemon SSL 3\*.*
  • x64\*.* → C:\Program Files\FireDaemon OpenSSL 3\*.*
  • x86\*.* → C:\Program Files (x86)\FireDaemon OpenSSL 3\*.*
Для удобства можно добавить путь к файлу openssl.exe в системную переменную PATH.

Создание приватного ключа

Первое, что необходимо сделать - это создать приватный (он же закрытый или секретный) ключ. Им будут подписываться создаваемые сертификаты. Длина ключа может быть любым положительным целым числом, но обычно используют значения кратные 8 или 16: 1024, 2048, 4096 бит и т.д. Рекомендуется использовать 2048 бит, так как он обеспечивает достаточную стойкость для большинства сценариев использования. Слишком маленькая длина ключа не обеспечивает достаточной стойкости ключа к взлому, а слишком большая создает значительную вычислительную нагрузку на систему в процессе шифрования и расшифровки.

Команда для создания ключа следующая:

openssl genpkey -algorithm RSA -aes256 -out "ca_private.key" -pkeyopt rsa_keygen_bits:2048

Это действие создаст файл "ca_private.key.txt", содержащий закрытый ключ, созданный по алгоритму RSA длиной 2048 бит. Данный ключ будет зашифрован алгоритмом AES256, поэтому при его создании и каждом последующем использовании потребуется ввести пароль. Если шифровать ключ не требуется - уберите параметр "-aes256".

Чтобы не вводить пароль вручную есть возможность передать его через командную строку или текстовый файл, но это небезопасно. Для этого добавьте следующие параметры: "-pass pass:Pa$$w0rd" или "-pass file:password.txt".

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

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

Создание открытого ключа, соответствующего приватному:

openssl rsa -in private.key -pubout -out public.key

Обратите внимание, что эта команда предназначена для создания открытого ключа на основе приватного ключа RSA. Если у вас есть приватный ключ, сгенерированный с использованием другого алгоритма, вам может потребоваться использовать соответствующую команду для создания открытого ключа из приватного ключа. Помним, что пары ключей "приватный-публичный" используются в алгоритмах асимметричного шифрования (наиболее распространенные - RSA, DSA, ECDSA, Diffie-Hellman), а не в симметричных.

Расшифровка приватного ключа:

openssl rsa -in encrypted_private.key -out decrypted_private.key

Зашифровать приватный ключ можно командой:

openssl rsa -in private.key -out encrypted_private.key -aes256

Создание сертификата удостоверяющего центра

Сначала создадим запрос на подпись сертификата.

openssl req -new -key ca_private.key -out ca.csr

В процессе создания нам надо будет ввести пароль приватного ключа и информацию о нашем удостоверяющем центре. Значения в квадратных скобках подставляются по умолчанию, если ничего не вводить.

  • Country Name (2 letter code) [AU]: Двухбуквенный код страны (BY, RU, US и т.п.)
  • State or Province Name (full name) [Some-State]: Область
  • Locality Name (eg, city) []: Город
  • Organization Name (eg, company) [Internet Widgits Pty Ltd]: Название организации
  • Organizational Unit Name (eg, section) []: Название отдела
  • Common Name (e.g. server FQDN or YOUR name) []: Название удостоверяющего центра
  • Email Address []: Адрес электронной почты
  • A challenge password []: Этот пароль обычно используется при запросе на выдачу сертификата удостоверяющему центру. Сейчас не требуется.
  • An optional company name []: То же самое, что и Organization Name. Сейчас не требуется.

Затем создадим самоподписанный сертификат удостоверяющего центра сроком действия 365 дней.

openssl x509 -req -days 365 -in ca.csr -signkey ca_private.key -out ca.crt

или одной командой

openssl req -x509 -new -keyout ca_private.key -out certificate.crt -days 365

Опция `-subj` в OpenSSL позволяет указать информацию об организации или субъекте сертификата в виде строки. Эта информация включает в себя название организации, департамента, местоположения, страны и других данных.

Строка с информацией о субъекте должна быть в формате `/имя_поля=значение`, где каждое поле представлено своим значением и разделено символом `/`. Некоторые из возможных полей, которые можно указать с помощью `-subj`, включают:

  • `/C=`: Двухбуквенный код страны (например, BY для Беларуси)
  • `/ST=`: Полное название штата или провинции, области
  • `/L=`: Название города или населенного пункта
  • `/O=`: Название организации или компании
  • `/OU=`: Название департамента или подразделения
  • `/CN=`: Общее имя (Common Name), как правило, доменное имя (например, www.example.com)

Пример использования `-subj` для создания запроса на подпись сертификата (CSR):

openssl req -new -key private.key -out request.csr -subj "/C=BY/ST=Minsk region/L=Minsk/O=Example Company/CN=www.example.com"

Обратите внимание, что не все поля являются обязательными, и если некоторые поля не указаны, OpenSSL может запрашивать их значения в процессе выполнения команды.

Таким образом мы получили самоподписанный сертификат удостоверяющего центра в файле "ca.crt". При двойном клике на файле откроется окно с параметрами сертификата. Он недействителен, пока не внесен в хранилище доверенных корневых сертификатов центров сертификации. Нажмите кнопку "Установить сертификат", выберите расположение хранилища (Локальный компьютер - сертификат установится для всех пользователей данного компьютера), затем укажите хранилище сертификата "Доверенные корневые центры сертификации". После сообщения об успешном добавлении закройте и снова откройте свойства сертификата. Он будет уже действительным.

В доменной сети можно распространить сертификат на все компьютеры при помощи групповых политик.

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

Тут что-то должно быть написано.

Создание промежуточного центра сертификации

Тут что-то должно быть написано.

Комментариев нет:

Отправить комментарий