Содержание статьи

SSL-сертификат – это не просто инструмент для шифрования трафика, а обязательный элемент современного веб-проекта. Без него браузеры помечают сайт как «небезопасный», а поисковые системы снижают позиции в выдаче. Самоподписанные сертификаты или решения от Let’s Encrypt позволяют получить защищённое соединение без затрат, но требуют точной настройки.
Для генерации сертификата локально понадобится OpenSSL – инструмент с открытым исходным кодом, доступный на Linux, macOS и Windows через WSL или Git Bash. Команда openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes создаст самоподписанный сертификат сроком на год. Ключ -nodes отключает шифрование приватного ключа, что упрощает тестирование, но недопустимо для продакшена.
Let’s Encrypt предлагает бесплатные сертификаты через протокол ACME, автоматизирующий процесс валидации домена. Утилита Certbot – самый надёжный способ установки: sudo certbot certonly --webroot -w /var/www/html -d example.com. Сертификаты обновляются каждые 90 дней, поэтому настройте cron-задачу для автоматического продления: 0 3 * * * certbot renew --quiet.
После генерации сертификат нужно привязать к веб-серверу. Для Nginx конфигурация выглядит так: ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; и ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;. Apache требует директив SSLCertificateFile и SSLCertificateKeyFile. Проверьте корректность настроек с помощью openssl s_client -connect example.com:443 -servername example.com.
Самоподписанные сертификаты подходят только для тестирования или внутренних сетей. Для публичных сайтов используйте Let’s Encrypt или коммерческие центры сертификации (CA), такие как DigiCert или Sectigo. Избегайте уязвимостей: отключайте устаревшие протоколы (SSLv3, TLS 1.0/1.1) и используйте современные шифры, например, TLS_AES_256_GCM_SHA384.
Выбор типа SSL сертификата для самостоятельной генерации

Для самостоятельной генерации доступны три основных типа SSL-сертификатов: самоподписанные, сертификаты, подписанные собственным центром сертификации (CA), и Let’s Encrypt. Самоподписанные сертификаты просты в создании – их можно сгенерировать за минуту с помощью OpenSSL командой openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365. Однако браузеры и клиенты будут выдавать предупреждения о ненадёжности, так как сертификат не подтверждён доверенным центром. Подходит только для тестирования или внутренних сетей, где доверие устанавливается вручную.
Создание собственного центра сертификации (CA) даёт больше контроля: вы подписываете сертификаты для своих доменов и распространяете корневой сертификат CA среди пользователей или устройств. Это устраняет предупреждения браузеров, но требует дополнительных шагов – генерации корневого сертификата, настройки доверия на клиентских машинах и управления списками отзыва (CRL). Инструменты: openssl ca или cfssl. Актуально для корпоративных сетей или закрытых проектов, где внешние CA нежелательны.
Let’s Encrypt – бесплатный и автоматизированный вариант для публичных сайтов. Сертификаты выдаются через протокол ACME (например, с помощью Certbot) и автоматически обновляются. Поддерживает домены, поддомены и wildcard-сертификаты (*.example.com). Ограничение: срок действия – 90 дней, но Certbot решает проблему автообновления. Идеален для продакшен-сайтов, так как доверяется всеми браузерами без дополнительных настроек.
При выборе учитывайте цель: тестирование – самоподписанный, внутренние сети – собственный CA, публичный сайт – Let’s Encrypt. Для wildcard-сертификатов Let’s Encrypt требует DNS-валидацию, а самоподписанные и CA позволяют использовать любые домены без проверки. Криптографические параметры: RSA 2048 бит – минимально допустимый стандарт, 4096 бит – рекомендуется для повышенной безопасности. ECDSA (например, prime256v1) обеспечивает лучшую производительность при том же уровне защиты.
Установка необходимых инструментов для создания сертификата

Для генерации самоподписанного SSL-сертификата потребуется OpenSSL – кроссплатформенный инструмент с открытым исходным кодом. Версия должна быть не ниже 1.1.1, так как в более ранних отсутствуют критические исправления безопасности и поддержка современных алгоритмов (например, TLS 1.3). Проверить установленную версию можно командой:
openssl version
Если OpenSSL отсутствует или устарел, обновите его через пакетный менеджер вашей ОС.
На Linux-системах (Debian/Ubuntu) установка выполняется одной командой:
sudo apt update && sudo apt install openssl -y
Для CentOS/RHEL используйте:
sudo yum install openssl -y
На macOS OpenSSL уже предустановлен, но часто это устаревшая версия. Обновите её через Homebrew:
brew install openssl
После установки убедитесь, что путь к бинарному файлу добавлен в переменную PATH или используйте полный путь при вызове, например /usr/local/opt/openssl/bin/openssl.
Для Windows потребуется скачать бинарные файлы OpenSSL с официального сайта slproweb.com. Выбирайте версию Win64 OpenSSL v3.x.x Light – она содержит только необходимые компоненты. Избегайте установщиков с дополнительным ПО. После загрузки запустите инсталлятор и следуйте шагам:
- Укажите путь установки без пробелов (например,
C:\OpenSSL). - Добавьте OpenSSL в системную переменную
PATH. - Завершите установку и перезагрузите командную строку.
Проверьте корректность установки командой openssl version в cmd или PowerShell.
В качестве альтернативы OpenSSL можно использовать cfssl – инструмент от Cloudflare, оптимизированный для работы с инфраструктурой PKI. Установите его через Go:
go install github.com/cloudflare/cfssl/cmd/cfssl@latest
Или скачайте предкомпилированные бинарники с GitHub-репозитория. CFSSL удобен для автоматизации генерации сертификатов в CI/CD-конвейерах, но требует дополнительной настройки конфигурационных файлов в формате JSON.
Для генерации сертификатов с расширенными параметрами (например, SAN – Subject Alternative Names) понадобится текстовый редактор с поддержкой синтаксиса конфигурационных файлов. Рекомендуется использовать:
- VS Code с расширением OpenSSL Config Syntax.
- Notepad++ с плагином Compare для анализа изменений в конфигах.
- Vim с подсветкой синтаксиса для OpenSSL (
syntax onв.vimrc).
Избегайте редакторов, автоматически изменяющих кодировку файлов (например, Блокнот Windows), – это может привести к ошибкам при генерации сертификата.
Если планируется интеграция сертификата с веб-сервером (Nginx, Apache), установите соответствующее ПО заранее. Для Nginx на Ubuntu:
sudo apt install nginx -y
Для Apache:
sudo apt install apache2 -y
Проверьте, что модули ssl и rewrite включены:
sudo a2enmod ssl rewrite
Это позволит сразу протестировать сертификат после генерации без дополнительных настроек.
Для проверки корректности созданного сертификата установите OpenSSL s_client (входит в состав OpenSSL) или специализированные инструменты:
- SSL Labs Test (ssllabs.com) – онлайн-сервис для анализа конфигурации.
- TestSSL.sh – скрипт для локальной проверки:
curl -L https://testssl.sh/testssl.sh | bash
Эти инструменты выявят уязвимости, такие как устаревшие протоколы (SSLv3, TLS 1.0) или слабые шифры (DES, RC4), которые необходимо исключить из конфигурации.
Генерация закрытого ключа и запроса на подпись сертификата (CSR)

Закрытый ключ – основа безопасности SSL-сертификата. Для его генерации используйте OpenSSL с алгоритмом RSA (рекомендуемая длина – 2048 или 4096 бит) или ECDSA (кривая secp384r1 для баланса производительности и стойкости). Команда для RSA-2048:

openssl genpkey -algorithm RSA -out private.key -pkeyopt rsa_keygen_bits:2048
Для ECDSA с кривой secp384r1:
openssl ecparam -genkey -name secp384r1 -out private.key
Храните private.key в защищённом месте: доступ к нему позволяет расшифровывать трафик. Установите права доступа 600 (chmod 600 private.key) и исключите его из резервных копий, если они не шифруются.
CSR (Certificate Signing Request) содержит публичный ключ и данные о домене. Формируется на основе закрытого ключа. Пример команды для генерации CSR с RSA-ключом:
openssl req -new -key private.key -out request.csr -sha256
Для ECDSA-ключа алгоритм подписи (-sha256) должен соответствовать кривой. OpenSSL запросит ввод данных: заполняйте поля строго по требованиям центра сертификации (CA). Критические поля:
| Поле | Значение | Примечание |
|---|---|---|
Common Name (CN) |
Полное доменное имя (FQDN) | Для wildcard-сертификата: *.example.com |
Organization (O) |
Юридическое название компании | Должно совпадать с регистрационными документами |
Locality (L) |
Город | Указывайте без сокращений (например, «Москва») |
Country (C) |
Двухбуквенный код | ISO 3166-1 alpha-2 (например, RU) |
Избегайте использования специальных символов в полях, кроме дефисов и точек. Для мультидоменных сертификатов (SAN) добавьте секцию subjectAltName в конфигурационный файл OpenSSL. Пример содержимого файла csr_config.cnf:
[req] distinguished_name = req_distinguished_name req_extensions = v3_req prompt = no [req_distinguished_name] CN = example.com O = Example Inc L = Санкт-Петербург C = RU [v3_req] keyUsage = keyEncipherment, dataEncipherment extendedKeyUsage = serverAuth subjectAltName = @alt_names [alt_names] DNS.1 = example.com DNS.2 = www.example.com DNS.3 = api.example.com
Генерируйте CSR с конфигом:
openssl req -new -key private.key -out request.csr -config csr_config.cnf -sha256
Проверьте содержимое CSR перед отправкой в CA:
openssl req -in request.csr -noout -text
Убедитесь, что Subject и X509v3 Subject Alternative Name содержат корректные данные. Ошибки в этих полях приведут к отказу в выдаче сертификата. Для wildcard-сертификатов CN должен начинаться с *., а SAN – включать базовый домен (например, DNS.1 = example.com).
При генерации CSR для EV-сертификатов (Extended Validation) укажите дополнительные поля: jurisdictionOfIncorporationCountryName (страна регистрации), businessCategory (тип организации). Пример:
openssl req -new -key private.key -out ev.csr -sha256 -subj "/C=RU/ST=Московская область/L=Москва/O=Example Inc/CN=example.com/businessCategory=Private Organization/jurisdictionC=RU"
CA сверяют эти данные с государственными реестрами, поэтому указывайте их точно.
Храните CSR в безопасном месте: он не содержит секретных данных, но его повторное использование для разных CA может вызвать проблемы с валидацией. Для автоматизации процесса используйте скрипты на Python с библиотекой cryptography или Ansible-модуль community.crypto.openssl_csr. Пример Python-кода для генерации CSR:
from cryptography import x509
from cryptography.x509.oid import NameOID
from cryptography.hazmat.primitives import hashes, serialization
from cryptography.hazmat.primitives.asymmetric import rsa
key = rsa.generate_private_key(public_exponent=65537, key_size=2048)
csr = (
x509.CertificateSigningRequestBuilder()
.subject_name(x509.Name([
x509.NameAttribute(NameOID.COUNTRY_NAME, "RU"),
x509.NameAttribute(NameOID.ORGANIZATION_NAME, "Example Inc"),
x509.NameAttribute(NameOID.COMMON_NAME, "example.com"),
]))
.add_extension(
x509.SubjectAlternativeName([
x509.DNSName("example.com"),
x509.DNSName("www.example.com"),
]),
critical=False,
)
.sign(key, hashes.SHA256())
)
with open("request.csr", "wb") as f:
f.write(csr.public_bytes(serialization.Encoding.PEM))
После генерации CSR отправьте его в выбранный CA. Большинство центров сертификации предоставляют веб-интерфейс для загрузки файла request.csr. Некоторые CA (например, Let’s Encrypt) автоматизируют процесс через протокол ACME, где CSR генерируется на стороне сервера. Для Let’s Encrypt используйте:
certbot certonly --manual --csr request.csr --preferred-challenges dns
Убедитесь, что закрытый ключ и CSR не попадают в публичные репозитории или логи. При работе в облачных средах (AWS, GCP) используйте встроенные сервисы управления ключами (AWS KMS, Google Cloud KMS) для генерации и хранения ключей.

Создание самоподписанного сертификата или получение бесплатного от Let’s Encrypt

Самоподписанные SSL-сертификаты подходят для тестирования, внутренних сетей или разработки, но не признаются браузерами как доверенные. Для их генерации используйте OpenSSL. Команда openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes создаст ключ и сертификат сроком на год. Параметр -nodes отключает шифрование ключа паролем, что удобно для автоматизации, но снижает безопасность. Храните key.pem в защищённом месте – его компрометация позволит подделывать сертификаты.
Let’s Encrypt предоставляет бесплатные доверенные сертификаты через протокол ACME. Для автоматизации процесса установите Certbot: sudo apt install certbot (Debian/Ubuntu) или sudo dnf install certbot (Fedora). Запустите sudo certbot certonly --webroot -w /var/www/html -d example.com, где /var/www/html – корневая директория сайта, а example.com – ваш домен. Certbot проверит контроль над доменом, разместив временный файл в /.well-known/acme-challenge/.
При использовании самоподписанных сертификатов браузеры будут показывать предупреждение о недоверенном источнике. Чтобы избежать этого в локальной сети, добавьте сертификат в хранилище доверенных на клиентских устройствах. В Windows: импортируйте cert.pem через Свойства браузера → Содержание → Сертификаты → Доверенные корневые центры сертификации. В Linux (Ubuntu) скопируйте сертификат в /usr/local/share/ca-certificates/ и выполните sudo update-ca-certificates.
Let’s Encrypt поддерживает wildcard-сертификаты для поддоменов через DNS-валидацию. Для получения используйте sudo certbot certonly --manual --preferred-challenges=dns -d *.example.com. Certbot предложит добавить TXT-запись в DNS домена. После подтверждения сертификат будет сохранён в /etc/letsencrypt/live/example.com/. Учтите, что wildcard-сертификаты не покрывают корневой домен (example.com) – для него потребуется отдельный запрос.
Если веб-сервер не поддерживает ACME (например, в закрытых сетях), используйте DNS-плагины Certbot. Для Cloudflare установите certbot-dns-cloudflare и настройте API-токен в /etc/letsencrypt/cloudflare.ini. Запустите sudo certbot certonly --dns-cloudflare --dns-cloudflare-credentials /etc/letsencrypt/cloudflare.ini -d example.com. Это позволит получать сертификаты без открытого доступа к порту 80.
Для отладки проблем с сертификатами используйте openssl s_client -connect example.com:443 -servername example.com. Команда покажет цепочку сертификатов, срок действия и поддерживаемые шифры. Проверьте статус сертификата Let’s Encrypt на crt.sh или через sudo certbot certificates. При ошибках валидации убедитесь, что DNS-записи корректны и веб-сервер доступен из интернета.
. Команда покажет цепочку сертификатов, срок действия и поддерживаемые шифры. Проверьте статус сертификата Let’s Encrypt на crt.sh или через sudo certbot certificates. При ошибках валидации убедитесь, что DNS-записи корректны и веб-сервер доступен из интернета.»>
