Основы OpenSSL: Работа с SSL-сертификатами, закрытыми ключами и CSR

Введение

OpenSSL – это универсальный инструмент командной строки, который может использоваться для множества задач, связанных с инфраструктурой открытых ключей (PKI) и HTTPS (HTTP через TLS). Этот стилевой путеводитель в формате шпаргалки предоставляет быстрый справочник по командам OpenSSL, которые полезны в повседневных сценариях. Сюда входят примеры использования OpenSSL для генерации закрытых ключей, запросов на подпись сертификатов и конвертации формата сертификатов. Он не охватывает все возможности OpenSSL.

Как использовать этот путеводитель:

  • Если вы не знакомы с запросами на подпись сертификатов (CSRs), прочтите первый раздел
  • Помимо первого раздела, этот путеводитель имеет формат шпаргалки: список самодостаточных фрагментов командной строки
  • Перейдите к любому разделу, который относится к задаче, которую вы пытаетесь выполнить (Подсказка: используйте меню Содержание или функцию Найти вашего браузера)
  • Большинство команд – это однострочники, которые были развернуты на несколько строк (с использованием символа \) для ясности

О запросах на подпись сертификатов (CSRs)

Если вы хотите получить SSL-сертификат от коммерческого центра сертификации (CA), вам необходимо создать запрос на подпись сертификата (CSR). CSR в основном состоит из открытого ключа пары ключей и дополнительной информации. Оба эти компонента вставляются в сертификат при его подписании.

При создании CSR вас попросят предоставить информацию о сертификате. Эта информация известна как уникальное имя (DN). Важным полем в DN является Общее имя (CN), которое должно быть точным полным доменным именем (FQDN) хоста, который вы планируете использовать с сертификатом. Также можно пропустить интерактивные запросы при создании CSR, передавая информацию через командную строку или из файла.

Другие элементы в DN предоставляют дополнительную информацию о вашем бизнесе или организации. Если вы покупаете SSL-сертификат у центра сертификации, часто требуется, чтобы эти дополнительные поля, такие как “Организация”, точно отражали данные вашей организации.

Вот пример того, как будет выглядеть запрос информации о CSR:

---
Country Name (2 letter code) [AU]:US
State or Province Name (full name) [Some-State]:New York
Locality Name (eg, city) []:Brooklyn
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Example Brooklyn Company
Organizational Unit Name (eg, section) []:Technology Division
Common Name (e.g. server FQDN or YOUR name) []:examplebrooklyn.com
Email Address []:

Если вы хотите ответить на запрос информации о CSR без интерактивного взаимодействия, вы можете сделать это, добавив параметр -subj ко всем командам OpenSSL, запрашивающим информацию о CSR. Вот пример использования этого параметра с той же информацией, отображаемой в приведенном выше блоке кода:

-subj "/C=US/ST=New York/L=Brooklyn/O=Example Brooklyn Company/CN=examplebrooklyn.com"

Теперь, когда вы понимаете CSR, не стесняйтесь переходить к той секции данного руководства, которая соответствует вашим потребностям OpenSSL.

Генерация CSR

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

Помните, что вы можете добавить информацию CSR без участия пользователя с помощью опции -subj, упомянутой в предыдущем разделе.

Создание закрытого ключа и CSR

Используйте этот метод, если вы хотите использовать HTTPS (HTTP через TLS) для защиты вашего веб-сервера Apache HTTP или Nginx, и вы хотите использовать Центр сертификации (CA) для выдачи SSL-сертификата. Сгенерированный CSR можно отправить в CA для запроса подписанного SSL-сертификата от CA. Если ваш CA поддерживает SHA-2, добавьте опцию -sha256 для подписи CSR с использованием SHA-2.

Эта команда создает закрытый ключ 2048 бит (domain.key) и CSR (domain.csr) с нуля:

  1. openssl req \
  2. -newkey rsa:2048 -nodes -keyout domain.key \
  3. -out domain.csr

Ответьте на запрос информации CSR, чтобы завершить процесс.

Опция -newkey rsa:2048 указывает, что ключ должен быть 2048-битным, сгенерированным с использованием алгоритма RSA. Опция -nodes указывает, что приватный ключ не должен быть зашифрован парольной фразой. Опция -new, которая здесь не указана, но подразумевается, указывает на то, что создается CSR.

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

Используйте этот метод, если у вас уже есть приватный ключ, который вы хотели бы использовать для запроса сертификата у ЦС.

Эта команда создает новый CSR (domain.csr) на основе существующего приватного ключа (domain.key):

  1. openssl req \
  2. -key domain.key \
  3. -new -out domain.csr

Ответьте на запрос информации о CSR, чтобы завершить процесс.

Опция -key указывает существующий приватный ключ (domain.key), который будет использоваться для создания нового CSR. Опция -new указывает на то, что создается CSR.

Создание CSR из существующего сертификата и приватного ключа

Используйте этот метод, если вы хотите обновить существующий сертификат, но у вас или вашего ЦС нет оригинального CSR по какой-то причине. Это в основном экономит вам хлопот повторного ввода информации CSR, так как он извлекает эту информацию из существующего сертификата.

Эта команда создает новый CSR (domain.csr) на основе существующего сертификата (domain.crt) и закрытого ключа (domain.key):

  1. openssl x509 \
  2. -in domain.crt \
  3. -signkey domain.key \
  4. -x509toreq -out domain.csr

Опция -x509toreq указывает, что вы используете сертификат X509 для создания CSR.

Генерация SSL-сертификатов

Если вы хотите использовать SSL-сертификат для защиты сервиса, но вам не требуется сертификат, подписанный ЦС, действительное (и бесплатное) решение – подписывать свои собственные сертификаты.

A common type of certificate that you can issue yourself is a self-signed certificate. A self-signed certificate is a certificate that is signed with its own private key. Self-signed certificates can be used to encrypt data just as well as CA-signed certificates, but your users will be displayed a warning that says that the certificate is not trusted by their computer or browser. Therefore, self-signed certificates should only be used if you do not need to prove your service’s identity to its users (e.g. non-production or non-public servers).

Этот раздел охватывает команды OpenSSL, связанные с генерацией самоподписанных сертификатов.

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

Используйте этот метод, если вы хотите использовать HTTPS (HTTP через TLS) для защиты вашего веб-сервера Apache HTTP или Nginx, и вам не требуется, чтобы ваш сертификат был подписан ЦС.

Эта команда создает 2048-битный закрытый ключ (domain.key) и самоподписанный сертификат (domain.crt) с нуля:

  1. openssl req \
  2. -newkey rsa:2048 -nodes -keyout domain.key \
  3. -x509 -days 365 -out domain.crt

Ответьте на запрос информации CSR, чтобы завершить процесс.

Опция -x509 указывает req создать самоподписанный сертификат. Опция -days 365 определяет, что сертификат будет действителен в течение 365 дней. Создается временный CSR для сбора информации, связанной с сертификатом.

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

Используйте этот метод, если у вас уже есть закрытый ключ, с которым вы хотели бы создать самоподписанный сертификат.

Эта команда создает самоподписанный сертификат (domain.crt) из существующего закрытого ключа (domain.key):

  1. openssl req \
  2. -key domain.key \
  3. -new \
  4. -x509 -days 365 -out domain.crt

Ответьте на запрос информации CSR, чтобы завершить процесс.

Опция -x509 указывает req создать самоподписанный сертификат. Опция -days 365 определяет, что сертификат будет действителен в течение 365 дней. Опция -new активирует запрос информации CSR.

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

Используйте этот метод, если у вас уже есть закрытый ключ и CSR, и вы хотите создать самоподписанный сертификат с их помощью.

Эта команда создает самоподписанный сертификат (domain.crt) из существующего закрытого ключа (domain.key) и (domain.csr):

  1. openssl x509 \
  2. -signkey domain.key \
  3. -in domain.csr \
  4. -req -days 365 -out domain.crt

Опция -days 365 указывает, что сертификат будет действителен в течение 365 дней.

Просмотр сертификатов

Файлы сертификата и CSR закодированы в формате PEM, который не читаем для человека.

Этот раздел содержит команды OpenSSL, которые выведут фактические записи файлов, закодированных в формате PEM.

Просмотр записей CSR

Эта команда позволяет просматривать и проверять содержимое CSR (domain.csr) в виде обычного текста:

  1. openssl req -text -noout -verify -in domain.csr

Просмотр записей сертификата

Эта команда позволяет просматривать содержимое сертификата (domain.crt) в виде обычного текста:

  1. openssl x509 -text -noout -in domain.crt

Проверка того, что сертификат был подписан ЦС

Используйте эту команду, чтобы убедиться, что сертификат (domain.crt) был подписан определенным сертификатом ЦС (ca.crt):

  1. openssl verify -verbose -CAFile ca.crt domain.crt

Закрытые ключи

Этот раздел охватывает команды OpenSSL, специфичные для создания и проверки закрытых ключей.

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

Используйте эту команду, чтобы создать защищенный паролем закрытый ключ длиной 2048 бит (domain.key):

  1. openssl genrsa -des3 -out domain.key 2048

Введите пароль, когда будете приглашены, чтобы завершить процесс.

Проверка закрытого ключа

Используйте эту команду, чтобы проверить, что закрытый ключ (domain.key) является допустимым ключом:

  1. openssl rsa -check -in domain.key

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

Проверка соответствия закрытого ключа сертификату и CSR

Используйте эти команды, чтобы проверить, соответствует ли закрытый ключ (domain.key) сертификату (domain.crt) и CSR (domain.csr):

  1. openssl rsa -noout -modulus -in domain.key | openssl md5
  2. openssl x509 -noout -modulus -in domain.crt | openssl md5
  3. openssl req -noout -modulus -in domain.csr | openssl md5

Если вывод каждой команды идентичен, существует крайне высокая вероятность того, что закрытый ключ, сертификат и CSR связаны между собой.

Шифрование закрытого ключа

Эта команда принимает незашифрованный закрытый ключ (unencrypted.key) и выводит зашифрованную версию (encrypted.key):

  1. openssl rsa -des3 \
  2. -in unencrypted.key \
  3. -out encrypted.key

Введите желаемую парольную фразу для шифрования закрытого ключа.

Расшифровка закрытого ключа

Это преобразует зашифрованный закрытый ключ (encrypted.key) и выводит расшифрованную версию (decrypted.key):

  1. openssl rsa \
  2. -in encrypted.key \
  3. -out decrypted.key

Введите пароль для зашифрованного ключа при запросе.

Преобразование форматов сертификатов

Все сертификаты, с которыми мы работали, были сертификатами X.509, которые кодированы в ASCII PEM. Существует множество других типов кодирования и контейнеров сертификатов; некоторые приложения предпочитают определенные форматы перед другими. Кроме того, многие из этих форматов могут содержать несколько элементов, таких как закрытый ключ, сертификат и сертификат ЦС в одном файле.

OpenSSL можно использовать для преобразования сертификатов в и из большого количества этих форматов. В этом разделе будут рассмотрены некоторые возможные преобразования.

Преобразование PEM в DER

Используйте эту команду, если хотите преобразовать PEM-кодированный сертификат (domain.crt) в DER-кодированный сертификат (domain.der), бинарный формат:

  1. openssl x509 \
  2. -in domain.crt \
  3. -outform der -out domain.der

Формат DER обычно используется с Java.

Преобразовать DER в PEM

Используйте эту команду, если вы хотите преобразовать DER-кодированный сертификат (domain.der) в PEM-кодированный сертификат (domain.crt):

  1. openssl x509 \
  2. -inform der -in domain.der \
  3. -out domain.crt

Преобразовать PEM в PKCS7

Используйте эту команду, если вы хотите добавить PEM-сертификаты (domain.crt и ca-chain.crt) в файл PKCS7 (domain.p7b):

  1. openssl crl2pkcs7 -nocrl \
  2. -certfile domain.crt \
  3. -certfile ca-chain.crt \
  4. -out domain.p7b

Обратите внимание, что вы можете использовать одну или несколько опций -certfile, чтобы указать, какие сертификаты добавить в файл PKCS7.

Файлы PKCS7, также известные как P7B, обычно используются в хранилищах ключей Java и Microsoft IIS (Windows). Они являются текстовыми файлами, которые могут содержать сертификаты и CA-сертификаты.

Преобразовать PKCS7 в PEM

Используйте эту команду, если вы хотите преобразовать файл PKCS7 (domain.p7b) в файл PEM:

  1. openssl pkcs7 \
  2. -in domain.p7b \
  3. -print_certs -out domain.crt

Обратите внимание, что если ваш файл PKCS7 содержит несколько элементов (например, сертификат и промежуточный сертификат CA), то PEM-файл, который будет создан, будет содержать все эти элементы.

Преобразование PEM в PKCS12

Используйте эту команду, если вы хотите объединить закрытый ключ (domain.key) и сертификат (domain.crt) в файл PKCS12 (domain.pfx):

  1. openssl pkcs12 \
  2. -inkey domain.key \
  3. -in domain.crt \
  4. -export -out domain.pfx

Вас попросят ввести пароль экспорта, который можно оставить пустым. Обратите внимание, что вы можете добавить цепочку сертификатов в файл PKCS12, объединив сертификаты в один PEM-файл (domain.crt) в этом случае.

Файлы PKCS12, также известные как файлы PFX, обычно используются для импорта и экспорта цепочек сертификатов в Microsoft IIS (Windows).

Преобразование PKCS12 в PEM

Используйте эту команду, если вы хотите преобразовать файл PKCS12 (domain.pfx) в формат PEM (domain.combined.crt):

openssl pkcs12 \
       -in domain.pfx \
       -nodes -out domain.combined.crt

Обратите внимание, что если ваш файл PKCS12 содержит несколько элементов (например, сертификат и закрытый ключ), то PEM-файл, который будет создан, будет содержать все эти элементы.

Версия OpenSSL

Команда openssl version может использоваться для проверки установленной версии. Версия OpenSSL, которую вы используете, а также опции компиляции, влияют на доступные вам возможности (иногда на параметры командной строки).

Следующая команда отображает версию OpenSSL, которую вы используете, а также все опции компиляции:

openssl version -a

Этот руководство написано с использованием двоичного файла OpenSSL с следующими деталями (вывод предыдущей команды):

OpenSSL 1.1.1  11 Sep 2018
built on: Mon Aug 23 17:02:39 2021 UTC
platform: debian-amd64
options:  bn(64,64) rc4(16x,int) des(int) blowfish(ptr)
compiler: gcc -fPIC -pthread -m64 -Wa,--noexecstack -Wall -Wa,--noexecstack -g -O2 -fdebug-prefix-map=/build/openssl-Flav1L/openssl-1.1.1=. -fstack-protector-strong -Wformat -Werror=format-security -DOPENSSL_USE_NODELETE -DL_ENDIAN -DOPENSSL_PIC -DOPENSSL_CPUID_OBJ -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DKECCAK1600_ASM -DRC4_ASM -DMD5_ASM -DAES_ASM -DVPAES_ASM -DBSAES_ASM -DGHASH_ASM -DECP_NISTZ256_ASM -DX25519_ASM -DPADLOCK_ASM -DPOLY1305_ASM -DNDEBUG -Wdate-time -D_FORTIFY_SOURCE=2
OPENSSLDIR: "/usr/lib/ssl"
ENGINESDIR: "/usr/lib/x86_64-linux-gnu/engines-1.1"
Seeding source: os-specific

Заключение

Это должно охватить то, как большинство людей используют OpenSSL для работы с SSL-сертификатами. У него есть множество других применений, которые здесь не были рассмотрены, поэтому не стесняйтесь задавать вопросы или предлагать другие способы использования в комментариях.

Если у вас возникают проблемы с какими-либо командами, не забудьте оставить комментарий (и включить вывод версии OpenSSL).

Source:
https://www.digitalocean.com/community/tutorials/openssl-essentials-working-with-ssl-certificates-private-keys-and-csrs