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

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

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

Самоподписанные сертификаты особенно полезны для локальных проектов, staging-окружений, внутренних API, административных панелей и тестирования SSL-конфигураций. Они обеспечивают шифрование трафика, хотя и не гарантируют аутентичность сервера. В этой статье мы пошагово разберем, как создать и настроить самоподписанный SSL-сертификат для Apache на Ubuntu 24.

Как работает самоподписанный SSL-сертификат

Обычный SSL-сертификат подписывается доверенным центром сертификации (CA), который подтверждает подлинность домена. Самоподписанный сертификат создается и подписывается самим владельцем сервера без участия внешнего CA. Браузеры не доверяют таким сертификатам по умолчанию, но криптографическая защита при этом работает точно так же.

Основные компоненты SSL-сертификата:

  • Закрытый ключ (private key) — секретный ключ, который должен храниться в безопасности
  • Открытый ключ (public key) — включается в сертификат для шифрования
  • Сертификат (certificate) — содержит открытый ключ и информацию о владельце
  • Подпись — криптографическое подтверждение подлинности сертификата

Подготовка системы

Для начала убедитесь, что у вас есть VPS с Ubuntu 24 или выделенный сервер с установленным Apache. Если Apache еще не установлен, выполните:

sudo apt update
sudo apt install apache2
sudo systemctl enable apache2
sudo systemctl start apache2

Также нам понадобится OpenSSL для создания сертификата:

sudo apt install openssl

Создание самоподписанного SSL-сертификата

Теперь создадим директорию для хранения SSL-сертификатов и сгенерируем закрытый ключ и сертификат одной командой:

sudo mkdir -p /etc/ssl/private
sudo mkdir -p /etc/ssl/certs

sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
    -keyout /etc/ssl/private/apache-selfsigned.key \
    -out /etc/ssl/certs/apache-selfsigned.crt

Разберем параметры команды:

  • -x509 — создать самоподписанный сертификат
  • -nodes — не шифровать закрытый ключ паролем
  • -days 365 — срок действия сертификата (1 год)
  • -newkey rsa:2048 — создать новый 2048-битный RSA ключ
  • -keyout — путь для сохранения закрытого ключа
  • -out — путь для сохранения сертификата

Система попросит ввести информацию о сертификате. Самое важное поле — Common Name (CN), где нужно указать доменное имя или IP-адрес сервера:

Country Name (2 letter code) [AU]: RU
State or Province Name (full name) [Some-State]: Moscow
Locality Name (eg, city) []: Moscow
Organization Name (eg, company) [Internet Widgits Pty Ltd]: My Company
Organizational Unit Name (eg, section) []: IT Department
Common Name (e.g. server FQDN or YOUR name) []: example.com
Email Address []: admin@example.com

Настройка Apache для работы с SSL

Включите SSL-модуль Apache:

sudo a2enmod ssl
sudo a2enmod headers

Создайте конфигурационный файл для SSL-сайта:

sudo nano /etc/apache2/sites-available/default-ssl.conf

Вставьте следующую конфигурацию:

<IfModule mod_ssl.c>
    <VirtualHost _default_:443>
        ServerAdmin admin@example.com
        ServerName example.com
        
        DocumentRoot /var/www/html
        
        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined
        
        SSLEngine on
        SSLCertificateFile /etc/ssl/certs/apache-selfsigned.crt
        SSLCertificateKeyFile /etc/ssl/private/apache-selfsigned.key
        
        # Современные настройки SSL
        SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1
        SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384
        SSLHonorCipherOrder off
        SSLSessionTickets off
        
        # Заголовки безопасности
        Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"
        Header always set X-Frame-Options DENY
        Header always set X-Content-Type-Options nosniff
        
        <FilesMatch "\.(cgi|shtml|phtml|php)$">
            SSLOptions +StdEnvVars
        </FilesMatch>
        
        <Directory /usr/lib/cgi-bin>
            SSLOptions +StdEnvVars
        </Directory>
    </VirtualHost>
</IfModule>

Активируйте SSL-сайт и перезапустите Apache:

sudo a2ensite default-ssl
sudo systemctl reload apache2

Автоматическое перенаправление HTTP на HTTPS

Чтобы все HTTP-запросы автоматически перенаправлялись на HTTPS, добавьте в конфигурацию HTTP-сайта:

sudo nano /etc/apache2/sites-available/000-default.conf

Добавьте директиву Redirect внутри блока VirtualHost:

<VirtualHost *:80>
    ServerName example.com
    Redirect permanent / https://example.com/
</VirtualHost>

Перезапустите Apache:

sudo systemctl reload apache2

Тестирование SSL-сертификата

Проверьте, что Apache слушает на портах 80 и 443:

sudo netstat -tlnp | grep apache

Должны увидеть что-то вроде:

tcp6   0   0 :::80    :::*    LISTEN   12345/apache2
tcp6   0   0 :::443   :::*    LISTEN   12345/apache2

Теперь откройте браузер и перейдите на https://your-domain.com или https://your-server-ip. Браузер покажет предупреждение о недоверенном сертификате — это нормально для самоподписанного сертификата.

Практические кейсы и рекомендации

Сценарий использования Преимущества Недостатки Рекомендации
Локальная разработка Быстрое развертывание, тестирование HTTPS Предупреждения браузера Добавьте сертификат в доверенные в браузере
Внутренние сервисы Шифрование трафика, бесплатно Нет проверки подлинности Используйте для интранета с корпоративным CA
Staging окружение Полное воспроизведение prod-среды Возможные проблемы с интеграциями Замените на валидный сертификат перед prod
API для тестирования Защищенные запросы Нужно игнорировать ошибки SSL в клиентах Используйте флаг –insecure в curl

Автоматизация создания сертификатов

Для массового создания сертификатов можно использовать скрипт:

#!/bin/bash
# create-ssl-cert.sh

DOMAIN=$1
if [ -z "$DOMAIN" ]; then
    echo "Usage: $0 domain.com"
    exit 1
fi

# Создание сертификата
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
    -keyout /etc/ssl/private/${DOMAIN}.key \
    -out /etc/ssl/certs/${DOMAIN}.crt \
    -subj "/C=RU/ST=Moscow/L=Moscow/O=Company/CN=${DOMAIN}"

# Установка правильных прав
sudo chmod 600 /etc/ssl/private/${DOMAIN}.key
sudo chmod 644 /etc/ssl/certs/${DOMAIN}.crt

echo "SSL certificate created for ${DOMAIN}"
echo "Certificate: /etc/ssl/certs/${DOMAIN}.crt"
echo "Private key: /etc/ssl/private/${DOMAIN}.key"

Сохраните скрипт и сделайте его исполняемым:

chmod +x create-ssl-cert.sh
sudo ./create-ssl-cert.sh mydomain.com

Мониторинг и обслуживание

Для проверки информации о сертификате используйте:

# Проверка сертификата
sudo openssl x509 -in /etc/ssl/certs/apache-selfsigned.crt -text -noout

# Проверка срока действия
sudo openssl x509 -in /etc/ssl/certs/apache-selfsigned.crt -noout -dates

# Проверка работы SSL через командную строку
curl -k -I https://your-domain.com

Для автоматического обновления сертификатов настройте cron-задачу:

# Обновление сертификата каждые 11 месяцев
0 0 1 */11 * /path/to/create-ssl-cert.sh your-domain.com && systemctl reload apache2

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

Кроме самоподписанных сертификатов, рассмотрите:

  • Let’s Encrypt — бесплатные доверенные сертификаты через Certbot
  • mkcert — утилита для создания локальных доверенных сертификатов
  • ACME.sh — легковесная альтернатива Certbot
  • Caddy — веб-сервер с автоматическим получением SSL-сертификатов

Для установки mkcert:

sudo apt install libnss3-tools
wget https://github.com/FiloSottile/mkcert/releases/download/v1.4.4/mkcert-v1.4.4-linux-amd64
sudo mv mkcert-v1.4.4-linux-amd64 /usr/local/bin/mkcert
sudo chmod +x /usr/local/bin/mkcert

# Установка локального CA
mkcert -install

# Создание сертификата
mkcert example.com "*.example.com" localhost 127.0.0.1

Интеграция с Docker и контейнерами

Если вы используете Docker, можете создать многоступенчатый Dockerfile:

FROM ubuntu:24.04

RUN apt-get update && apt-get install -y apache2 openssl

# Создание SSL-сертификата
RUN openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
    -keyout /etc/ssl/private/apache-selfsigned.key \
    -out /etc/ssl/certs/apache-selfsigned.crt \
    -subj "/C=RU/ST=Moscow/L=Moscow/O=Company/CN=localhost"

# Копирование конфигурации
COPY default-ssl.conf /etc/apache2/sites-available/
RUN a2enmod ssl && a2ensite default-ssl

EXPOSE 80 443

CMD ["apache2ctl", "-D", "FOREGROUND"]

Безопасность и лучшие практики

Несколько важных рекомендаций по безопасности:

  • Защитите закрытый ключ — права доступа 600, владелец root
  • Используйте сильные алгоритмы — RSA 2048+ или ECDSA P-256
  • Регулярно обновляйте сертификаты — не ждите истечения срока
  • Настройте правильные SSL-протоколы — отключите старые версии
  • Добавьте HSTS-заголовки — принудительное использование HTTPS

Для проверки качества SSL-конфигурации используйте:

# Проверка поддерживаемых протоколов
nmap --script ssl-enum-ciphers -p 443 your-domain.com

# Тест с помощью OpenSSL
openssl s_client -connect your-domain.com:443 -servername your-domain.com

Troubleshooting частых проблем

Если возникают проблемы, проверьте:

  • Права доступа к файлам — ключ должен быть доступен только root
  • Синтаксис конфигурацииsudo apache2ctl configtest
  • Статус модулейsudo apache2ctl -M | grep ssl
  • Логи Apachesudo tail -f /var/log/apache2/error.log
  • Открытые портыsudo ufw allow 443/tcp

Интересные факты и нестандартные применения

Самоподписанные сертификаты можно использовать для:

  • Настройки VPN — создание собственного CA для OpenVPN
  • Подписи кода — создание сертификатов для подписи скриптов
  • Тестирования PKI — создание иерархии сертификатов
  • IoT-устройств — защищенная связь между устройствами
  • Мониторинга — SSL-сертификаты для Prometheus, Grafana

Можно создать сертификат с альтернативными именами (SAN):

# Создание конфигурационного файла
cat > /tmp/san.conf << EOF
[req]
distinguished_name = req_distinguished_name
req_extensions = v3_req

[req_distinguished_name]

[v3_req]
subjectAltName = @alt_names

[alt_names]
DNS.1 = example.com
DNS.2 = www.example.com
DNS.3 = api.example.com
IP.1 = 192.168.1.100
EOF

# Создание сертификата с SAN
openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
    -keyout /etc/ssl/private/multi-domain.key \
    -out /etc/ssl/certs/multi-domain.crt \
    -config /tmp/san.conf \
    -extensions v3_req \
    -subj "/C=RU/ST=Moscow/L=Moscow/O=Company/CN=example.com"

Заключение и рекомендации

Самоподписанные SSL-сертификаты — это мощный инструмент для разработчиков и системных администраторов. Они обеспечивают шифрование трафика без необходимости получения сертификатов от внешних CA, что делает их идеальными для тестирования, разработки и внутренних сервисов.

Используйте самоподписанные сертификаты когда:

  • Тестируете SSL-конфигурации
  • Разрабатываете локально
  • Настраиваете внутренние сервисы
  • Создаете staging-окружения
  • Нужно быстро включить HTTPS

Не используйте для:

  • Продакшн-сайтов, доступных из интернета
  • Обработки критичных данных
  • Коммерческих приложений
  • Публичных API

Для продакшн-среды всегда используйте сертификаты от доверенных CA, таких как Let's Encrypt. Но для внутренних задач и разработки самоподписанные сертификаты — отличное решение, которое можно развернуть за несколько минут.

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


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

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

Leave a reply

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