OpenSSL — бесплатная библиотека шифрования и утилита командной строки openssl, которая идёт вместе с ней. Через неё создают ключи, запросы на сертификат (CSR), самоподписанные SSL-сертификаты, проверяют сертификат сайта и шифруют файлы. Самоподписанный сертификат для локальной разработки делается одной командой:
openssl req -x509 -newkey rsa:2048 -noenc -days 365 \
-keyout localhost.key -out localhost.crt \
-subj "/CN=localhost" \
-addext "subjectAltName=DNS:localhost,IP:127.0.0.1"
На выходе два файла: закрытый ключ localhost.key и сертификат localhost.crt. Как устроены сами протоколы, мы разбирали в статье «Что такое SSL и TLS», а здесь только команды. Все примеры ниже запущены на OpenSSL 4.0.3 (macOS) и 3.0.13 (Ubuntu 24.04), вывод в блоках настоящий.
Какую версию OpenSSL ставить

У проекта несколько живых веток, и у каждой свой срок поддержки. Таблица ниже собрана по странице загрузок OpenSSL на 2 ноября 2026 года.
| Ветка | Последний выпуск | Поддержка до | Кому подходит |
|---|---|---|---|
| 4.1 | 4.1.0, 23 октября 2026 | 23 ноября 2027 | новые проекты, свежий Homebrew |
| 4.0 | 4.0.3, 29 сентября 2026 | 14 мая 2027 | кто уже перешёл на 4.x |
| 3.5 LTS | 3.5.9, 29 сентября 2026 | 8 апреля 2030 | серверы и всё, что должно жить долго |
| 3.6 | 3.6.5, 29 сентября 2026 | 1 ноября 2026 | поддержка закончилась, обновляйтесь |
Ветки 3.0, 1.1.1 и 1.0.2 проект больше не поддерживает, об этом сказано в политике выпусков. При этом в Ubuntu 24.04 до сих пор стоит 3.0.13: дистрибутив сам переносит в неё исправления безопасности, поэтому системный пакет обновляйте через apt, а не меняйте руками.
Для командной строки разница между ветками небольшая. В 4.0 убрали SSLv3, движки (engines) и скрипт c_rehash, его заменяет openssl rehash (список изменений есть в NEWS.md проекта). Все команды этой статьи одинаково работают в 3.x и 4.x, кроме мелочей в формате вывода.
Как установить OpenSSL на Windows, macOS и Linux
Проверить, есть ли утилита, можно одной командой в терминале:
openssl version
OpenSSL 4.0.3 29 Sep 2026 (Library: OpenSSL 4.0.3 29 Sep 2026)
Windows
В самой Windows OpenSSL нет. Три рабочих варианта:
- Установщик Shining Light. На slproweb.com лежат сборки Win64 и ARM64. Авторы сборок пишут, что обычно хватает редакции Light.
- winget. В PowerShell:
winget install ShiningLight.OpenSSL.Light. Это тот же установщик, только без браузера. - Git for Windows. Если Git уже стоит, OpenSSL у вас есть: он лежит внутри и запускается из Git Bash. По заметкам к выпускам, с сентября 2026 года в комплекте OpenSSL 3.5.9.
После установщика откройте новое окно терминала. Если openssl version отвечает «не является внутренней или внешней командой», добавьте папку bin из каталога установки в переменную PATH.
macOS
Команда openssl в macOS уже есть, но это LibreSSL, ответвление OpenSSL от OpenBSD:
/usr/bin/openssl version
LibreSSL 3.3.6
Части флагов из этой статьи у LibreSSL нет, например -brief у s_client и -copy_extensions. Настоящий OpenSSL ставится через Homebrew: brew install openssl даёт ветку 4.1, а brew install openssl@3 ставит LTS 3.5 (карточка формулы).
Linux
В Ubuntu и Debian утилита почти всегда стоит из коробки. Если нет, поставьте её через sudo apt install openssl, а в Fedora и RHEL через sudo dnf install openssl.
Для сборки своих программ на C с библиотекой нужен ещё пакет заголовков libssl-dev (в Fedora openssl-devel), а линковать придётся с флагами -lssl -lcrypto. Про сам компилятор есть отдельная инструкция по установке.
Как создать закрытый ключ
С ключа начинается всё остальное: сертификат, CSR, подпись. Для любого алгоритма подходит одна современная команда, genpkey:
# RSA 3072 бита
openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:3072 -out server.key
# эллиптическая кривая P-256: короче и быстрее RSA
openssl genpkey -algorithm EC -pkeyopt ec_paramgen_curve:P-256 -out ec.key
# Ed25519 — для подписей
openssl genpkey -algorithm ED25519 -out ed.key
Все три файла начинаются со строки -----BEGIN PRIVATE KEY-----: это формат PEM, обычный текст в Base64. Как устроена эта кодировка, разобрано в статье про Base64.
| Алгоритм | Где пригодится | Что учесть |
|---|---|---|
| RSA 2048–4096 | сайты, почта, старые системы | поддерживается везде, ключ и подпись длинные |
| EC P-256 | сайты и API | короткий ключ, быстрое рукопожатие |
| Ed25519 | подписи файлов, SSH, токены | самый короткий ключ; для сертификата сайта берите RSA или EC |
Ключ можно сразу закрыть паролем, добавив шифр. Тогда первая строка файла станет -----BEGIN ENCRYPTED PRIVATE KEY-----, и OpenSSL будет спрашивать пароль при каждом использовании:
openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:3072 \
-aes-256-cbc -out server-protected.key
Для ключа веб-сервера пароль обычно не ставят: nginx или Apache не смогут подняться после перезагрузки без человека. Вместо пароля ограничьте доступ к файлу: chmod 600 server.key. Права, пользователи и настройка nginx входят в программу курсов по администрированию Linux.
Как создать самоподписанный сертификат
Самоподписанный сертификат подписан своим же ключом, а не центром сертификации. Как связаны закрытый и открытый ключи, объясняет статья о том, как устроена криптография. Браузер ему не доверяет, но для локальной разработки, тестового стенда и внутренних сервисов его хватает. Команда из начала статьи по флагам:
| Флаг | Что делает |
|---|---|
req -x509 |
выпустить сразу сертификат, а не запрос на него |
-newkey rsa:2048 |
заодно создать новый ключ RSA |
-noenc |
не шифровать ключ паролем; старый флаг -nodes в 3.x и 4.x помечен как устаревший |
-days 365 |
срок действия в днях |
-subj "/CN=localhost" |
имя владельца без интерактивных вопросов |
-addext "subjectAltName=…" |
альтернативные имена: домены и IP, для которых сертификат действует |
Без строки subjectAltName сертификат в браузере не заработает. Стандарт RFC 9525 запрещает опознавать сервер по полю Common Name, имя берётся только из расширения subjectAltName. Сертификат с одним CN=localhost современный браузер отклонит, даже если добавить его в доверенные.
Проверяем, что получилось:
openssl x509 -in localhost.crt -noout -subject -issuer -dates -ext subjectAltName
subject=CN=localhost
issuer=CN=localhost
notBefore=Nov 2 05:20:31 2026 GMT
notAfter=Nov 2 05:20:31 2027 GMT
X509v3 Subject Alternative Name:
DNS:localhost, IP Address:127.0.0.1
Совпадение subject и issuer и есть признак самоподписанного сертификата. Вместо замка HTTPS браузер покажет предупреждение. Чтобы оно исчезло, файл localhost.crt добавляют в системное хранилище доверенных корневых сертификатов Windows, macOS или Linux.
Как сделать CSR для центра сертификации
Для публичного сайта нужен сертификат от центра сертификации. Ему отправляют запрос на подпись (CSR): в нём открытый ключ и имена, а закрытый ключ остаётся у вас.
- Создайте ключ, как в разделе выше.
- Сформируйте запрос с нужными доменами:
openssl req -new -key server.key -out server.csr \ -subj "/C=RU/O=Example/CN=example.ru" \ -addext "subjectAltName=DNS:example.ru,DNS:www.example.ru" - Проверьте подпись и содержимое запроса:
openssl req -in server.csr -noout -verify -subject Certificate request self-signature verify OK subject=C=RU, O=Example, CN=example.ru - Вставьте текст
server.csrв форму центра сертификации или у хостинга.
Если доменов много, удобнее конфиг
Длинную строку -addext легко испортить лишней запятой. Когда имён больше двух-трёх, их выносят в файл настроек, например san.cnf:
[req]
distinguished_name = dn
req_extensions = ext
prompt = no
[dn]
C = RU
O = Example
CN = example.ru
[ext]
subjectAltName = @alt_names
[alt_names]
DNS.1 = example.ru
DNS.2 = www.example.ru
DNS.3 = api.example.ru
Строка prompt = no отключает вопросы про страну и организацию: всё берётся из секции [dn]. Запрос создаётся командой openssl req -new -key server.key -config san.cnf -out server.csr, и в нём оказываются все три домена. Этот же файл годится для самоподписанного сертификата: добавьте к команде -x509 -days 365, а в секцию [req] строку x509_extensions = ext.
Для бесплатных сертификатов Let’s Encrypt CSR вручную обычно не делают: клиент certbot создаёт ключ и запрос сам. Сроки у публичных сертификатов сокращаются. По решению CA/Browser Forum максимальный срок с марта 2026 года поэтапно уменьшается с 398 до 47 дней к марту 2029-го, так что продление стоит сразу автоматизировать.
Свой центр сертификации для внутренней сети

Когда сервисов внутри компании много, удобнее завести свой маленький центр сертификации (CA). Тогда в доверенные добавляют один корневой сертификат, а не каждый по отдельности.
- Корневой ключ и сертификат CA на 10 лет:
openssl req -x509 -newkey rsa:4096 -noenc -days 3650 \ -keyout ca.key -out ca.crt -subj "/CN=My Test CA" - Подпись CSR сервера корневым ключом:
openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key \ -CAcreateserial -out server.crt -days 397 -copy_extensions copyall Certificate request self-signature ok subject=C=RU, O=Example, CN=example.ru - Проверка цепочки:
openssl verify -CAfile ca.crt server.crt server.crt: OK
Флаг -copy_extensions copyall переносит subjectAltName из запроса в сертификат. Без него домены из CSR потеряются, и браузер снова пожалуется на имя. Файл ca.key храните отдельно от серверов: кто его получит, тот выпустит сертификат на любое имя в вашей сети. В компаниях такой центр обычно ведёт администратор Linux или служба безопасности.
Как посмотреть и проверить сертификат
Полное содержимое сертификата выводит openssl x509 -in server.crt -noout -text. Для повседневных задач хватает коротких команд.
Отпечаток сертификата
openssl x509 -in localhost.crt -noout -fingerprint -sha256
sha256 Fingerprint=A6:B0:A5:E7:14:03:1E:55:0F:FA:2E:DA:08:20:15:9C:41:2D:30:91:CA:17:FD:B6:6B:1D:76:D0:71:67:0B:DE
Подходит ли ключ к сертификату
Частая ситуация после переезда сервера: файлов много, и непонятно, какой ключ от какого сертификата. Сравните хеши открытых ключей, они должны совпасть:
openssl x509 -in server.crt -noout -pubkey | openssl sha256
SHA2-256(stdin)= d276c283e96a6ccba498e1388af9980863ab332b0f00fb5685274a493c9f9881
openssl pkey -in server.key -pubout | openssl sha256
SHA2-256(stdin)= d276c283e96a6ccba498e1388af9980863ab332b0f00fb5685274a493c9f9881
Сертификат живого сайта
Команда s_client подключается к серверу как браузер и показывает итог рукопожатия:
openssl s_client -connect checkroi.ru:443 -servername checkroi.ru -brief </dev/null
Connecting to 5.253.61.149
CONNECTION ESTABLISHED
Protocol version: TLSv1.3
Ciphersuite: TLS_AES_256_GCM_SHA384
Peer certificate: CN=checkroi.ru
Hash used: SHA256
Signature type: rsa_pss_rsae_sha256
Verification: OK
Peer Temp Key: X25519, 253 bits
DONE
Флаг -servername не пропускайте: на одном IP часто живут десятки сайтов, и без него сервер может отдать чужой сертификат. Чтобы увидеть всю цепочку, которую отдаёт сервер, добавьте -showcerts. У checkroi.ru в ответе три блока BEGIN CERTIFICATE: сертификат сайта и промежуточные сертификаты Let’s Encrypt.
Срок действия и издателя удобно вытащить в одну строку, передав сертификат по конвейеру:
echo | openssl s_client -connect checkroi.ru:443 -servername checkroi.ru 2>/dev/null \
| openssl x509 -noout -issuer -enddate
issuer=C=US, O=Let's Encrypt, CN=YR2
notAfter=Dec 27 23:30:00 2026 GMT
Для мониторинга есть флаг -checkend с числом секунд. -checkend 2592000 проверяет, проживёт ли сертификат ещё 30 дней: код выхода 0 значит «да», а 1 значит «пора продлевать». Строку легко повесить в cron, если вы уже пользуетесь основными командами Linux. Такие проверки срока сертификатов обычно настраивает DevOps-инженер.
Как конвертировать PEM, DER и PFX
Разные программы ждут сертификат в разной упаковке. Linux-серверы и nginx берут PEM, Windows и IIS чаще хотят PFX с ключом внутри.
| Задача | Команда |
|---|---|
| PEM → DER | openssl x509 -in server.crt -outform DER -out server.der |
| DER → PEM | openssl x509 -in server.der -inform DER -out server.pem |
| PEM + ключ → PFX | openssl pkcs12 -export -out server.pfx -inkey server.key -in server.crt -certfile ca.crt |
| PFX → сертификаты | openssl pkcs12 -in server.pfx -nokeys -out certs.pem |
| PFX → ключ без пароля | openssl pkcs12 -in server.pfx -nocerts -noenc -out server.key |
При создании PFX OpenSSL спросит пароль на сам контейнер. Ключ внутри шифруется AES-256, это видно в сводке openssl pkcs12 -in server.pfx -noout -info:
MAC: sha256, Iteration 2048
PKCS7 Encrypted data: PBES2, PBKDF2, AES-256-CBC, Iteration 2048, PRF hmacWithSHA256
Shrouded Keybag: PBES2, PBKDF2, AES-256-CBC, Iteration 2048, PRF hmacWithSHA256
Старые PFX, выгруженные из Windows много лет назад, зашифрованы алгоритмом RC2, и OpenSSL 3.x и 4.x открывать их по умолчанию отказывается. Как это выглядит и что с этим делать, показано в разделе про ошибки.
Как зашифровать файл паролем
Команда enc шифрует файл паролем. Рабочий вариант для 3.x и 4.x:
# зашифровать
openssl enc -aes-256-cbc -pbkdf2 -iter 600000 -salt \
-in secret.txt -out secret.enc
# расшифровать — те же параметры плюс -d
openssl enc -d -aes-256-cbc -pbkdf2 -iter 600000 \
-in secret.enc -out secret.txt
Пароль OpenSSL спросит сам. Зашифрованный файл начинается с подписи Salted__, по ней его легко узнать. Для регулярной защиты данных в компании одной команды мало, этим занимается специалист по информационной безопасности.
Флаг -pbkdf2 не пропускайте. Без него ключ из пароля выводится старым быстрым способом, и OpenSSL прямо об этом предупреждает:
*** WARNING : deprecated key derivation used.
Using -iter or -pbkdf2 would be better.
По документации enc, с -pbkdf2 по умолчанию делается 10 000 итераций. Чем их больше, тем дольше подбирать пароль перебором. Число итераций обязательно запишите: при расшифровке с другим значением получится ошибка bad decrypt.
У enc есть ограничение. Та же документация прямо говорит, что команда не поддерживает режимы с проверкой целостности вроде GCM, и попытка выдаёт enc: AEAD ciphers not supported. Значит, испорченный или подменённый файл enc не распознает. Если это важно, рядом с файлом кладут подпись из следующего раздела.
Хеши, подписи и случайные строки
Контрольная сумма файла считается командой dgst. Результат совпадает с sha256sum в Linux и shasum -a 256 в macOS:
openssl dgst -sha256 secret.txt
SHA2-256(secret.txt)= 1b9ce2a4289c1edf122fbc206f4abfd57182bee5d926680eee65a4c752d9d68f
Подпись доказывает, что файл не меняли и что его отправили именно вы. Подписывают закрытым ключом, проверяют открытым:
openssl pkey -in server.key -pubout -out server.pub
openssl dgst -sha256 -sign server.key -out secret.sig secret.txt
openssl dgst -sha256 -verify server.pub -signature secret.sig secret.txt
Verified OK
Если поменять в файле хоть один символ, вместо Verified OK будет Verification failure и код выхода 1. Почему так работает, объясняет статья о том, как устроена криптография.
Ещё в OpenSSL есть генератор случайных данных. Им удобно делать пароли, токены и секреты для конфигов:
openssl rand -hex 16 # 32 шестнадцатеричных символа
openssl rand -base64 32
4n94XkJn/T+Gy8Vl2gN813miv9Bl7t/05Xs20ETpigE=
Шпаргалка: главные команды OpenSSL
Всё из статьи в одной таблице. Имена файлов замените на свои.
| Задача | Команда |
|---|---|
| Версия | openssl version |
| Ключ EC | openssl genpkey -algorithm EC -pkeyopt ec_paramgen_curve:P-256 -out ec.key |
| Самоподписанный сертификат | openssl req -x509 -newkey rsa:2048 -noenc -days 365 -keyout a.key -out a.crt -subj "/CN=localhost" -addext "subjectAltName=DNS:localhost" |
| CSR | openssl req -new -key a.key -out a.csr -config san.cnf |
| Прочитать сертификат | openssl x509 -in a.crt -noout -text |
| Проверить цепочку | openssl verify -CAfile ca.crt a.crt |
| Сертификат сайта | openssl s_client -connect site.ru:443 -servername site.ru -brief |
| Собрать PFX | openssl pkcs12 -export -out a.pfx -inkey a.key -in a.crt |
| Зашифровать файл | openssl enc -aes-256-cbc -pbkdf2 -iter 600000 -salt -in f -out f.enc |
| Хеш файла | openssl dgst -sha256 f |
| Случайный токен | openssl rand -hex 32 |
Частые ошибки и что с ними делать

Тексты ошибок ниже сняты с OpenSSL 4.0.3. В 3.x они такие же, отличаются только пути к файлам исходников в хвосте строки.
bad decrypt
Симптом: при расшифровке enc -d выходит bad decrypt и строка с ossl_cipher_unpadblock.
Причина: неверный пароль или другие параметры: забыли -pbkdf2, поменяли -iter или шифр.
Решение: повторить ровно те флаги, с которыми файл шифровали.
Could not find or decode private key
Симптом: Could not find or decode private key of key from enc.key, а в хвосте maybe wrong password.
Причина: ключ под паролем, а пароль неверный. Если подсказки про пароль нет, скорее всего, вы подсунули не тот файл, например сертификат вместо ключа: на server.crt команда выдаёт ровно эту строку.
Решение: проверить первую строку файла через head -1, там будет видно, что внутри.
unable to get local issuer certificate
Симптом: error 20 at 0 depth lookup: unable to get local issuer certificate в openssl verify или s_client.
Причина: OpenSSL не нашёл, кто выпустил сертификат. На сервере это почти всегда пропущенный промежуточный сертификат в цепочке.
Решение: при проверке передайте корень через -CAfile ca.crt, а в конфиге сервера укажите полную цепочку (fullchain), а не один сертификат сайта.
verify error:num=18:self-signed certificate
Симптом: s_client подключается, но пишет об ошибке проверки с номером 18.
Причина: на сервере самоподписанный сертификат, и он не в списке доверенных. Для тестового стенда это нормально.
Решение: укажите сертификат явно через -CAfile localhost.crt, тогда проверка пройдёт.
RC2-40-CBC при открытии PFX
Симптом: Error outputting keys and certificates и Algorithm (RC2-40-CBC : 0) при чтении PFX.
Причина: контейнер зашифрован устаревшим алгоритмом, который в 3.x вынесли в отдельный провайдер legacy.
Решение: добавить флаг -legacy, например openssl pkcs12 -legacy -in old.pfx -nokeys -out certs.pem, и затем пересобрать PFX уже с AES. Флаг работает, только если провайдер legacy есть в вашей сборке: в Ubuntu 24.04 и Homebrew мы его проверили, он на месте.
deprecated key derivation used
Это не ошибка, файл всё равно зашифруется. Но это сигнал, что пароль защищён слабо: добавьте -pbkdf2 и, при желании, -iter.
Где освоить администрирование и безопасность системно
Ключи, CSR и проверка сертификатов входят в ежедневную работу администраторов, DevOps-инженеров и специалистов по безопасности. Если команды из статьи хочется понимать целиком, вместе с настройкой веб-серверов и сетей, посмотрите курсы по администрированию Linux и информационной безопасности в нашем каталоге.
| Курс | Школа | Стоимость со скидкой | В рассрочку | Длительность | Обзор курса от Checkroi |
|---|---|---|---|---|---|
| Профессия «Системный администратор» Перейти на сайт курса | 76 700 ₽ | 5125 ₽/мес. | 11 месяцев | Обзор курса | |
| Администрирование ОС Linux Перейти на сайт курса | 90 157 ₽ | 5556 ₽/мес. | 3 месяца | Обзор курса | |
| Системный администратор Перейти на сайт курса | 99 500 ₽ | 2764 ₽/мес. | 7 месяцев | Обзор курса | |
| Системный администратор (Бакалавриат) Перейти на сайт курса | 73 333 ₽ | - | 3 года | Обзор курса | |
| Linux для робототехников Перейти на сайт курса | 33 460 ₽ | - | 3 месяца | Обзор курса |
Больше программ — в полном каталоге курсов по администрированию Linux




