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

Вступление

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

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

  • Если вы не знакомы с запросами на подпись сертификатов (CSR), прочитайте первый раздел

  • Помимо первого раздела, это руководство представляет собой простой фрагмент кода в виде отдельного фрагмента командной строки.

  • Перейдите к любому разделу, который имеет отношение к задаче, которую вы пытаетесь выполнить (подсказка: используйте меню Contents слева внизу или функцию Find вашего браузера)

  • Большинство команд являются однострочными, которые были расширены до нескольких строк (с помощью символа + \ +) для ясности

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

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

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

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

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

---
Country Name (2 letter code) [AU]:
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 []:

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

-subj "/C=/ST=/L=/O=/CN="

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

Генерация CSR

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

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

Генерация закрытого ключа и CSR

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

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

openssl req \
      -newkey rsa:2048 -nodes -keyout  \
      -out

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

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

Генерация CSR из существующего закрытого ключа

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

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

openssl req \
      -key  \
      -new -out

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

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

Генерация CSR из существующего сертификата и закрытого ключа

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

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

openssl x509 \
      -in  \
      -signkey  \
      -x509toreq -out

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

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

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

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

В этом разделе рассматриваются команды OpenSSL, связанные с созданием самозаверяющих сертификатов.

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

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

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

openssl req \
      -newkey rsa:2048 -nodes -keyout  \
      -x509 -days 365 -out

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

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

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

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

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

openssl req \
      -key  \
      -new \
      -x509 -days 365 -out

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

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

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

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

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

openssl x509 \
      -signkey  \
      -in  \
      -req -days 365 -out

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

Посмотреть сертификаты

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

В этом разделе рассматриваются команды OpenSSL, которые будут выводить фактические записи файлов в кодировке PEM.

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

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

openssl req -text -noout -verify -in

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

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

openssl x509 -text -noout -in

Убедитесь, что сертификат был подписан центром сертификации

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

openssl verify -verbose -CAFile

Частные ключи

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

Создать личный ключ

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

openssl genrsa -des3 -out  2048

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

Подтвердите личный ключ

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

openssl rsa -check -in

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

Убедитесь, что закрытый ключ соответствует сертификату и CSR

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

openssl rsa -noout -modulus -in  | openssl md5
openssl x509 -noout -modulus -in  | openssl md5
openssl req -noout -modulus -in  | openssl md5

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

Зашифровать закрытый ключ

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

openssl rsa -des3 \
      -in  \
      -out

Введите желаемую фразу-пароль, чтобы зашифровать закрытый ключ с помощью.

Расшифровать личный ключ

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

openssl rsa \
      -in  \
      -out

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

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

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

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

Конвертировать PEM в DER

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

openssl x509 \
      -in  \
      -outform der -out

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

Конвертировать DER в PEM

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

openssl x509 \
      -inform der -in  \
      -out

Конвертировать PEM в PKCS7

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

openssl crl2pkcs7 -nocrl \
      -certfile  \
      -certfile  \
      -out domain.p7b

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

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

Конвертировать PKCS7 в PEM

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

openssl pkcs7 \
      -in  \
      -print_certs -out

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

Конвертировать PEM в PKCS12

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

openssl pkcs12 \
      -inkey  \
      -in  \
      -export -out

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

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

Конвертировать PKCS12 в PEM

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

openssl pkcs12 \
      -in  \
      -nodes -out

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

Версия OpenSSL

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

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

openssl version -a

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

OpenSSL 1.0.1f 6 Jan 2014
built on: Mon Apr  7 21:22:23 UTC 2014
platform: debian-amd64
options:  bn(64,64) rc4(16x,int) des(idx,cisc,16,int) blowfish(idx)
compiler: cc -fPIC -DOPENSSL_PIC -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -m64 -DL_ENDIAN -DTERMIO -g -O2 -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security -D_FORTIFY_SOURCE=2 -Wl,-Bsymbolic-functions -Wl,-z,relro -Wa,--noexecstack -Wall -DMD32_REG_T=int -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DMD5_ASM -DAES_ASM -DVPAES_ASM -DBSAES_ASM -DWHIRLPOOL_ASM -DGHASH_ASM
OPENSSLDIR: "/usr/lib/ssl"

Заключение

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

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