Поиск по сайту:

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


Введение

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

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

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

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

Если вы хотите получить SSL-сертификат от коммерческого центра сертификации (ЦС), вы должны создать запрос на подпись сертификата (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 и хотите использовать центр сертификации (ЦС) для выдачи сертификата SSL. Сгенерированный CSR можно отправить в ЦС для запроса на выдачу SSL-сертификата, подписанного ЦС. Если ваш ЦС поддерживает 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-сертификат для защиты службы, но вам не требуется сертификат, подписанный ЦС, действительным (и бесплатным) решением является подписание ваших собственных сертификатов.

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

В этом разделе рассматриваются команды 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 (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). Это файлы ASCII, которые могут содержать сертификаты и сертификаты CA.

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

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

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

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

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

Используйте эту команду, если вы хотите взять закрытый ключ (domain.key) и сертификат (domain.crt) и объединить их в файл PKCS12 ( домен.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).