Введение
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
) с нуля:
Ответьте на запрос информации CSR, чтобы завершить процесс.
Опция -newkey rsa:2048
указывает, что ключ должен быть 2048-битным, сгенерированным с использованием алгоритма RSA. Опция -nodes
указывает, что приватный ключ не должен быть зашифрован парольной фразой. Опция -new
, которая здесь не указана, но подразумевается, указывает на то, что создается CSR.
Создание CSR из существующего приватного ключа
Используйте этот метод, если у вас уже есть приватный ключ, который вы хотели бы использовать для запроса сертификата у ЦС.
Эта команда создает новый CSR (domain.csr
) на основе существующего приватного ключа (domain.key
):
Ответьте на запрос информации о CSR, чтобы завершить процесс.
Опция -key
указывает существующий приватный ключ (domain.key
), который будет использоваться для создания нового CSR. Опция -new
указывает на то, что создается CSR.
Создание CSR из существующего сертификата и приватного ключа
Используйте этот метод, если вы хотите обновить существующий сертификат, но у вас или вашего ЦС нет оригинального CSR по какой-то причине. Это в основном экономит вам хлопот повторного ввода информации CSR, так как он извлекает эту информацию из существующего сертификата.
Эта команда создает новый CSR (domain.csr
) на основе существующего сертификата (domain.crt
) и закрытого ключа (domain.key
):
Опция -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
) с нуля:
Ответьте на запрос информации CSR, чтобы завершить процесс.
Опция -x509
указывает req
создать самоподписанный сертификат. Опция -days 365
определяет, что сертификат будет действителен в течение 365 дней. Создается временный CSR для сбора информации, связанной с сертификатом.
Создание самоподписанного сертификата из существующего закрытого ключа
Используйте этот метод, если у вас уже есть закрытый ключ, с которым вы хотели бы создать самоподписанный сертификат.
Эта команда создает самоподписанный сертификат (domain.crt
) из существующего закрытого ключа (domain.key
):
Ответьте на запрос информации CSR, чтобы завершить процесс.
Опция -x509
указывает req
создать самоподписанный сертификат. Опция -days 365
определяет, что сертификат будет действителен в течение 365 дней. Опция -new
активирует запрос информации CSR.
Создание самоподписанного сертификата из существующего закрытого ключа и CSR
Используйте этот метод, если у вас уже есть закрытый ключ и CSR, и вы хотите создать самоподписанный сертификат с их помощью.
Эта команда создает самоподписанный сертификат (domain.crt
) из существующего закрытого ключа (domain.key
) и (domain.csr
):
Опция -days 365
указывает, что сертификат будет действителен в течение 365 дней.
Просмотр сертификатов
Файлы сертификата и CSR закодированы в формате PEM, который не читаем для человека.
Этот раздел содержит команды OpenSSL, которые выведут фактические записи файлов, закодированных в формате PEM.
Просмотр записей CSR
Эта команда позволяет просматривать и проверять содержимое CSR (domain.csr
) в виде обычного текста:
Просмотр записей сертификата
Эта команда позволяет просматривать содержимое сертификата (domain.crt
) в виде обычного текста:
Проверка того, что сертификат был подписан ЦС
Используйте эту команду, чтобы убедиться, что сертификат (domain.crt
) был подписан определенным сертификатом ЦС (ca.crt
):
Закрытые ключи
Этот раздел охватывает команды OpenSSL, специфичные для создания и проверки закрытых ключей.
Создание закрытого ключа
Используйте эту команду, чтобы создать защищенный паролем закрытый ключ длиной 2048 бит (domain.key
):
Введите пароль, когда будете приглашены, чтобы завершить процесс.
Проверка закрытого ключа
Используйте эту команду, чтобы проверить, что закрытый ключ (domain.key
) является допустимым ключом:
Если ваш закрытый ключ зашифрован, вам будет предложено ввести его пароль. После успешного выполнения незашифрованный ключ будет выведен в терминал.
Проверка соответствия закрытого ключа сертификату и CSR
Используйте эти команды, чтобы проверить, соответствует ли закрытый ключ (domain.key
) сертификату (domain.crt
) и CSR (domain.csr
):
Если вывод каждой команды идентичен, существует крайне высокая вероятность того, что закрытый ключ, сертификат и CSR связаны между собой.
Шифрование закрытого ключа
Эта команда принимает незашифрованный закрытый ключ (unencrypted.key
) и выводит зашифрованную версию (encrypted.key
):
Введите желаемую парольную фразу для шифрования закрытого ключа.
Расшифровка закрытого ключа
Это преобразует зашифрованный закрытый ключ (encrypted.key
) и выводит расшифрованную версию (decrypted.key
):
Введите пароль для зашифрованного ключа при запросе.
Преобразование форматов сертификатов
Все сертификаты, с которыми мы работали, были сертификатами X.509, которые кодированы в ASCII PEM. Существует множество других типов кодирования и контейнеров сертификатов; некоторые приложения предпочитают определенные форматы перед другими. Кроме того, многие из этих форматов могут содержать несколько элементов, таких как закрытый ключ, сертификат и сертификат ЦС в одном файле.
OpenSSL можно использовать для преобразования сертификатов в и из большого количества этих форматов. В этом разделе будут рассмотрены некоторые возможные преобразования.
Преобразование PEM в DER
Используйте эту команду, если хотите преобразовать PEM-кодированный сертификат (domain.crt
) в DER-кодированный сертификат (domain.der
), бинарный формат:
Формат DER обычно используется с Java.
Преобразовать DER в PEM
Используйте эту команду, если вы хотите преобразовать DER-кодированный сертификат (domain.der
) в PEM-кодированный сертификат (domain.crt
):
Преобразовать PEM в PKCS7
Используйте эту команду, если вы хотите добавить PEM-сертификаты (domain.crt
и ca-chain.crt
) в файл PKCS7 (domain.p7b
):
Обратите внимание, что вы можете использовать одну или несколько опций -certfile
, чтобы указать, какие сертификаты добавить в файл PKCS7.
Файлы PKCS7, также известные как P7B, обычно используются в хранилищах ключей Java и Microsoft IIS (Windows). Они являются текстовыми файлами, которые могут содержать сертификаты и CA-сертификаты.
Преобразовать PKCS7 в PEM
Используйте эту команду, если вы хотите преобразовать файл PKCS7 (domain.p7b
) в файл PEM:
Обратите внимание, что если ваш файл PKCS7 содержит несколько элементов (например, сертификат и промежуточный сертификат CA), то PEM-файл, который будет создан, будет содержать все эти элементы.
Преобразование PEM в PKCS12
Используйте эту команду, если вы хотите объединить закрытый ключ (domain.key
) и сертификат (domain.crt
) в файл PKCS12 (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).