Создание SSL сертификата для сайта своими руками

Как сделать ssl сертификат для сайта самому

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

Как сделать ssl сертификат для сайта самому

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 сертификата для самостоятельной генерации

Для самостоятельной генерации доступны три основных типа 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)

Генерация закрытого ключа и запроса на подпись сертификата (CSR)

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

Закрытый ключ – основа безопасности 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) для генерации и хранения ключей.

Убедитесь, что закрытый ключ и CSR не попадают в публичные репозитории или логи. При работе в облачных средах (AWS, GCP) используйте встроенные сервисы управления ключами (AWS KMS, Google Cloud KMS) для генерации и хранения ключей.

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

Создание самоподписанного сертификата или получение бесплатного от 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-записи корректны и веб-сервер доступен из интернета.

Для отладки проблем с сертификатами используйте undefinedopenssl s_client -connect example.com:443 -servername example.com</code loading=. Команда покажет цепочку сертификатов, срок действия и поддерживаемые шифры. Проверьте статус сертификата Let’s Encrypt на crt.sh или через sudo certbot certificates. При ошибках валидации убедитесь, что DNS-записи корректны и веб-сервер доступен из интернета.»>

Вопрос-ответ:

Ссылка на основную публикацию