OpenSSL — это швейцарский нож для работы с SSL/TLS-сертификатами. Каждая другая статья на этом сайте ссылается на команды OpenSSL — эта страница собирает их все в одном месте.
Проверка сертификата
Просмотр деталей сертификата (удалённый сервер)
echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null | openssl x509 -noout -text
Проверка даты истечения
echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null | openssl x509 -noout -enddate
Проверка субъекта и SAN
echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null | openssl x509 -noout -subject -ext subjectAltName
Проверка издателя (какой CA)
echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null | openssl x509 -noout -issuer
Проверка локального файла сертификата
openssl x509 -in cert.pem -noout -text
openssl x509 -in cert.pem -noout -dates # Только даты
openssl x509 -in cert.pem -noout -subject # Только субъект
openssl x509 -in cert.pem -noout -ext subjectAltName # Только SAN
Проверка цепочки сертификатов
Проверка полноты цепочки (удалённый сервер)
echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null
# Ищите:
# Verify return code: 0 (ok) ← Цепочка полная
# Verify return code: 21 (unable to verify) ← Цепочка неполная
Верификация сертификата по файлу цепочки
openssl verify -CAfile chain.pem cert.pem
# Ожидаемый результат: cert.pem: OK
Проверка соответствия сертификата и ключа
# Эти два хеша должны быть идентичны
openssl x509 -noout -modulus -in cert.pem | openssl md5
openssl rsa -noout -modulus -in privkey.pem | openssl md5
# Для ключей ECDSA:
openssl ec -in privkey.pem -pubout 2>/dev/null | openssl md5
openssl x509 -in cert.pem -pubkey -noout | openssl md5
Генерация ключей
ECDSA P-256 (рекомендуется)
openssl ecparam -genkey -name prime256v1 -noout -out privkey.pem
RSA 2048
openssl genrsa -out privkey.pem 2048
RSA 4096
openssl genrsa -out privkey.pem 4096
Создание CSR
ECDSA
openssl req -new -key privkey.pem -out csr.pem -subj "/CN=example.com"
С SAN (мультидоменный)
openssl req -new -key privkey.pem -out csr.pem \
-subj "/CN=example.com" \
-addext "subjectAltName=DNS:example.com,DNS:www.example.com"
Просмотр CSR
openssl req -in csr.pem -noout -text
Конвертация между форматами
PEM → PFX (для Windows/IIS)
openssl pkcs12 -export -out cert.pfx -inkey privkey.pem -in cert.pem -certfile chain.pem
PFX → PEM
openssl pkcs12 -in cert.pfx -clcerts -nokeys -out cert.pem
openssl pkcs12 -in cert.pfx -nocerts -nodes -out privkey.pem
openssl pkcs12 -in cert.pfx -cacerts -nokeys -out chain.pem
PEM → DER
openssl x509 -in cert.pem -outform DER -out cert.der
DER → PEM
openssl x509 -in cert.der -inform DER -outform PEM -out cert.pem
Форматы сертификатов подробно →
Отладка TLS-соединений
Проверка согласованной версии TLS
echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null | grep "Protocol"
Проверка конкретной версии TLS
# Проверка TLS 1.2
echo | openssl s_client -connect example.com:443 -servername example.com -tls1_2 2>/dev/null | grep "Protocol"
# Проверка TLS 1.3
echo | openssl s_client -connect example.com:443 -servername example.com -tls1_3 2>/dev/null | grep "Protocol"
Полное рукопожатие
openssl s_client -connect example.com:443 -servername example.com -msg
Проверка поддерживаемых наборов шифров
# Список всех шифров, принимаемых сервером
nmap --script ssl-enum-ciphers -p 443 example.com
Создание самоподписанного сертификата (только для разработки)
openssl req -x509 -newkey ec -pkeyopt ec_paramgen_curve:P-256 \
-keyout key.pem -out cert.pem -days 365 -nodes \
-subj "/CN=localhost" \
-addext "subjectAltName=DNS:localhost,IP:127.0.0.1"
Для доверенного HTTPS на localhost используйте mkcert.
Создание fullchain.pem из отдельных файлов
cat cert.pem chain.pem > fullchain.pem
Порядок важен: сначала ваш сертификат, затем промежуточный(е).
Часто задаваемые вопросы
Как установить OpenSSL?
Большинство дистрибутивов Linux включают его. На macOS: brew install openssl. На Windows: установите через Git for Windows (включает OpenSSL) или Chocolatey (choco install openssl).
В чём разница между openssl x509 и openssl s_client?
x509 читает локальный файл сертификата. s_client подключается к удалённому серверу и получает его сертификат. Используйте s_client для проверки работающего сервера; используйте x509 для просмотра файла на диске.
Почему мои команды показывают «unable to load certificate»?
Файл, вероятно, в формате DER (бинарный), а не PEM (текстовый). Добавьте -inform DER к команде:
openssl x509 -in cert.der -inform DER -noout -text