Home » Как создать самоподписанный SSL-сертификат для Nginx на Ubuntu
Как создать самоподписанный SSL-сертификат для Nginx на Ubuntu

Как создать самоподписанный 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;'
      "

Альтернативные решения

Другие инструменты для создания сертификатов:

Сравнение инструментов:

Инструмент Сложность Функции Лучше для
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 для максимальной безопасности

Самоподписанные сертификаты открывают возможности для быстрого прототипирования, безопасного тестирования и создания изолированных сред разработки. В сочетании с правильной автоматизацией они становятся незаменимым инструментом в арсенале любого системного администратора.


В этой статье собрана информация и материалы из различных интернет-источников. Мы признаем и ценим работу всех оригинальных авторов, издателей и веб-сайтов. Несмотря на то, что были приложены все усилия для надлежащего указания исходного материала, любая непреднамеренная оплошность или упущение не являются нарушением авторских прав. Все упомянутые товарные знаки, логотипы и изображения являются собственностью соответствующих владельцев. Если вы считаете, что какой-либо контент, использованный в этой статье, нарушает ваши авторские права, немедленно свяжитесь с нами для рассмотрения и принятия оперативных мер.

Данная статья предназначена исключительно для ознакомительных и образовательных целей и не ущемляет права правообладателей. Если какой-либо материал, защищенный авторским правом, был использован без должного упоминания или с нарушением законов об авторском праве, это непреднамеренно, и мы исправим это незамедлительно после уведомления. Обратите внимание, что переиздание, распространение или воспроизведение части или всего содержимого в любой форме запрещено без письменного разрешения автора и владельца веб-сайта. Для получения разрешений или дополнительных запросов, пожалуйста, свяжитесь с нами.

Leave a reply

Your email address will not be published. Required fields are marked