- Home »

Как создать самоподписанный SSL-сертификат для Nginx на Ubuntu
Если вы настраиваете веб-сервер и не хотите тратить время на получение сертификата от Let’s Encrypt для тестовой среды, или вам нужно быстро поднять HTTPS для внутренних сервисов — самоподписанный SSL-сертификат станет отличным решением. Да, браузеры будут ругаться на “небезопасное соединение”, но для разработки, тестирования и внутренних задач это именно то, что нужно.
В этой статье разберём, как за 10 минут создать самоподписанный SSL-сертификат и настроить Nginx под Ubuntu. Покажу не только базовые команды, но и расскажу про подводные камни, с которыми можете столкнуться, плюс дам пару лайфхаков для автоматизации процесса.
Как работают самоподписанные сертификаты
Самоподписанный сертификат — это обычный SSL-сертификат, который не подписан доверенным центром сертификации (CA). Вместо этого он подписан самим собой. Технически он обеспечивает шифрование трафика точно так же, как и “настоящий” сертификат, но браузеры не доверяют ему по умолчанию.
Основные отличия от сертификатов CA:
- Создание: Генерируется локально за секунды
- Стоимость: Бесплатно
- Доверие: Только после ручного добавления в доверенные
- Валидация: Никакой проверки владения доменом
- Срок действия: Любой, который укажете
Пошаговая настройка
Для работы понадобится сервер с Ubuntu и установленным Nginx. Если у вас его ещё нет, можете взять VPS или выделенный сервер.
Шаг 1: Установка необходимых пакетов
sudo apt update
sudo apt install nginx openssl -y
Шаг 2: Создание директории для сертификатов
sudo mkdir -p /etc/nginx/ssl
sudo chmod 700 /etc/nginx/ssl
Шаг 3: Генерация приватного ключа и сертификата
Классический способ в одну команду:
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
-keyout /etc/nginx/ssl/nginx.key \
-out /etc/nginx/ssl/nginx.crt \
-subj "/C=US/ST=State/L=City/O=Organization/CN=yourdomain.com"
Если хотите указать параметры интерактивно, уберите параметр -subj
:
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
-keyout /etc/nginx/ssl/nginx.key \
-out /etc/nginx/ssl/nginx.crt
Шаг 4: Настройка Nginx
Создайте или отредактируйте конфигурационный файл:
sudo nano /etc/nginx/sites-available/default
Базовая конфигурация с SSL:
server {
listen 80;
server_name yourdomain.com www.yourdomain.com;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl;
server_name yourdomain.com www.yourdomain.com;
ssl_certificate /etc/nginx/ssl/nginx.crt;
ssl_certificate_key /etc/nginx/ssl/nginx.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
root /var/www/html;
index index.html index.htm;
location / {
try_files $uri $uri/ =404;
}
}
Шаг 5: Проверка и перезапуск
sudo nginx -t
sudo systemctl reload nginx
Продвинутые настройки и оптимизация
Создание сертификата с SAN (Subject Alternative Names)
Для поддержки нескольких доменов создайте конфигурационный файл:
sudo nano /tmp/openssl.conf
[req]
distinguished_name = req_distinguished_name
req_extensions = v3_req
prompt = no
[req_distinguished_name]
C = US
ST = State
L = City
O = Organization
CN = yourdomain.com
[v3_req]
keyUsage = keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names
[alt_names]
DNS.1 = yourdomain.com
DNS.2 = www.yourdomain.com
DNS.3 = api.yourdomain.com
IP.1 = 192.168.1.100
Теперь создайте сертификат с этой конфигурацией:
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
-keyout /etc/nginx/ssl/nginx.key \
-out /etc/nginx/ssl/nginx.crt \
-config /tmp/openssl.conf \
-extensions v3_req
Усиленная конфигурация SSL в Nginx
server {
listen 443 ssl http2;
server_name yourdomain.com;
ssl_certificate /etc/nginx/ssl/nginx.crt;
ssl_certificate_key /etc/nginx/ssl/nginx.key;
# Современные протоколы
ssl_protocols TLSv1.2 TLSv1.3;
# Сильные шифры
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;
# HSTS
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
# Другие заголовки безопасности
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";
# Кэширование SSL-сессий
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
root /var/www/html;
index index.html;
}
Сравнение различных подходов
Характеристика | Самоподписанный | Let’s Encrypt | Коммерческий CA |
---|---|---|---|
Время создания | 30 секунд | 2-5 минут | От часов до дней |
Стоимость | Бесплатно | Бесплатно | $10-500+ в год |
Доверие браузеров | Нет | Да | Да |
Автообновление | Нет | Да (certbot) | Зависит от CA |
Валидация домена | Нет | Да | Да |
Срок действия | Любой | 90 дней | 1-2 года |
Автоматизация и скрипты
Скрипт для массового создания сертификатов
#!/bin/bash
# ssl-generator.sh
DOMAINS=("site1.local" "site2.local" "api.local")
SSL_DIR="/etc/nginx/ssl"
for domain in "${DOMAINS[@]}"; do
echo "Создаём сертификат для $domain"
openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
-keyout "$SSL_DIR/$domain.key" \
-out "$SSL_DIR/$domain.crt" \
-subj "/C=US/ST=State/L=City/O=Dev/CN=$domain"
echo "Сертификат для $domain создан"
done
# Перезапускаем Nginx
systemctl reload nginx
echo "Все сертификаты созданы и Nginx перезапущен"
Мониторинг срока действия
#!/bin/bash
# check-ssl-expiry.sh
SSL_DIR="/etc/nginx/ssl"
ALERT_DAYS=30
for cert in $SSL_DIR/*.crt; do
domain=$(basename "$cert" .crt)
expiry=$(openssl x509 -enddate -noout -in "$cert" | cut -d= -f2)
expiry_seconds=$(date -d "$expiry" +%s)
current_seconds=$(date +%s)
days_left=$(( (expiry_seconds - current_seconds) / 86400 ))
if [ $days_left -lt $ALERT_DAYS ]; then
echo "WARNING: Сертификат $domain истекает через $days_left дней"
fi
done
Практические кейсы использования
✅ Когда использовать самоподписанные сертификаты:
- Локальная разработка: Тестирование HTTPS на localhost
- Внутренние сервисы: API, админки, доступные только внутри сети
- Тестирование: Staging-окружения перед продакшеном
- IoT и embedded: Устройства в закрытой сети
- Микросервисы: Внутренняя коммуникация в кластере
❌ Когда НЕ стоит использовать:
- Публичные сайты: Пользователи увидят предупреждение о безопасности
- E-commerce: Доверие критично для онлайн-платежей
- API для сторонних разработчиков: Усложнит интеграцию
- Мобильные приложения: Могут отклонить соединение
Интересные факты и нестандартные применения
Факт 1: Самоподписанные сертификаты используются в 90% корпоративных сетей для внутренних сервисов.
Факт 2: Многие роутеры и сетевые устройства используют самоподписанные сертификаты для веб-интерфейсов.
Нестандартные способы использования:
- Подписание кода: Можно использовать для подписи скриптов в закрытой среде
- VPN-конфигурации: OpenVPN может использовать самоподписанные сертификаты
- Docker Registry: Приватные registry часто используют самоподписанные сертификаты
- Kubernetes: Для внутренней коммуникации между компонентами
Интеграция с другими инструментами
Для автоматизации в Docker Compose:
version: '3.8'
services:
nginx:
image: nginx:alpine
ports:
- "443:443"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
- ./ssl:/etc/nginx/ssl
command: >
sh -c "
if [ ! -f /etc/nginx/ssl/nginx.crt ]; then
openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
-keyout /etc/nginx/ssl/nginx.key \
-out /etc/nginx/ssl/nginx.crt \
-subj '/C=US/ST=State/L=City/O=Dev/CN=localhost'
fi &&
nginx -g 'daemon off;'
"
Альтернативные решения
Другие инструменты для создания сертификатов:
- mkcert: https://github.com/FiloSottile/mkcert — удобный инструмент для локальной разработки
- cfssl: https://github.com/cloudflare/cfssl — от Cloudflare для управления PKI
- easy-rsa: https://github.com/OpenVPN/easy-rsa — для создания собственного CA
Сравнение инструментов:
Инструмент | Сложность | Функции | Лучше для |
---|---|---|---|
OpenSSL | Средняя | Полный контроль | Серверы, продакшн |
mkcert | Низкая | Простота | Локальная разработка |
cfssl | Высокая | Корпоративная PKI | Большие организации |
easy-rsa | Средняя | Собственный CA | VPN, внутренние сети |
Решение типичных проблем
Проблема: “NET::ERR_CERT_AUTHORITY_INVALID”
Решение: Это нормально для самоподписанных сертификатов. Нажмите “Дополнительно” → “Перейти на сайт” или добавьте сертификат в доверенные.
Проблема: Nginx не стартует после добавления SSL
Решение: Проверьте права доступа к файлам сертификатов:
sudo chown root:root /etc/nginx/ssl/nginx.*
sudo chmod 600 /etc/nginx/ssl/nginx.key
sudo chmod 644 /etc/nginx/ssl/nginx.crt
Проблема: Сертификат не работает для IP-адресов
Решение: Используйте конфигурацию с SAN и добавьте IP в секцию [alt_names]
.
Заключение и рекомендации
Самоподписанные SSL-сертификаты — это мощный инструмент для разработки, тестирования и внутренних сервисов. Они не заменят настоящие сертификаты для публичных сайтов, но отлично подходят для сценариев, где скорость развёртывания важнее доверия браузеров.
Мои рекомендации:
- Для локальной разработки используйте mkcert — он автоматически добавляет сертификаты в доверенные
- Для серверов в продакшене всегда используйте Let’s Encrypt или коммерческие CA
- Автоматизируйте создание сертификатов с помощью скриптов
- Не забывайте про мониторинг срока действия
- Используйте современные настройки SSL в Nginx для максимальной безопасности
Самоподписанные сертификаты открывают возможности для быстрого прототипирования, безопасного тестирования и создания изолированных сред разработки. В сочетании с правильной автоматизацией они становятся незаменимым инструментом в арсенале любого системного администратора.
В этой статье собрана информация и материалы из различных интернет-источников. Мы признаем и ценим работу всех оригинальных авторов, издателей и веб-сайтов. Несмотря на то, что были приложены все усилия для надлежащего указания исходного материала, любая непреднамеренная оплошность или упущение не являются нарушением авторских прав. Все упомянутые товарные знаки, логотипы и изображения являются собственностью соответствующих владельцев. Если вы считаете, что какой-либо контент, использованный в этой статье, нарушает ваши авторские права, немедленно свяжитесь с нами для рассмотрения и принятия оперативных мер.
Данная статья предназначена исключительно для ознакомительных и образовательных целей и не ущемляет права правообладателей. Если какой-либо материал, защищенный авторским правом, был использован без должного упоминания или с нарушением законов об авторском праве, это непреднамеренно, и мы исправим это незамедлительно после уведомления. Обратите внимание, что переиздание, распространение или воспроизведение части или всего содержимого в любой форме запрещено без письменного разрешения автора и владельца веб-сайта. Для получения разрешений или дополнительных запросов, пожалуйста, свяжитесь с нами.