- Home » 
 
      
								Создание самоподписанного SSL-сертификата для Apache на Ubuntu 24
Самоподписанные SSL-сертификаты — это палочка-выручалочка для разработчиков и админов, которые хотят быстро настроить HTTPS на тестовых серверах или в dev-окружении. Да, они не дадут вам зелёный замочек в браузере, но для внутренних проектов, staging-серверов и домашних лабораторий — это именно то, что нужно. Особенно актуально для тех, кто работает с Apache на свежей Ubuntu 24, где некоторые нюансы конфигурации могут отличаться от предыдущих версий.
В этой статье мы разберём весь процесс создания самоподписанного SSL-сертификата для Apache на Ubuntu 24 — от генерации ключей до полной настройки виртуальных хостов. Никаких лишних телодвижений, только практические команды и рабочие примеры.
Как работают самоподписанные SSL-сертификаты
Самоподписанный сертификат — это цифровой сертификат, который подписан самим собой, а не доверенным центром сертификации (CA). По сути, вы становитесь собственным CA и говорите браузеру: “Поверь мне, я знаю, что делаю”. Браузер, конечно, не поверит и покажет предупреждение, но для разработки это совершенно нормально.
Процесс работы выглядит так:
- Генерируется приватный ключ
 - Создаётся запрос на сертификат (CSR)
 - Сертификат подписывается собственным приватным ключом
 - Apache настраивается для использования этого сертификата
 
Основное отличие от “настоящих” сертификатов — отсутствие цепочки доверия. Браузер не может проверить подлинность сертификата через известные CA, поэтому показывает предупреждение о безопасности.
Подготовка системы
Для начала убедимся, что у нас установлен Apache и включён SSL-модуль. На Ubuntu 24 процесс стандартный, но лучше перепроверить.
# Обновляем пакеты
sudo apt update && sudo apt upgrade -y
# Устанавливаем Apache, если ещё не установлен
sudo apt install apache2 -y
# Устанавливаем OpenSSL для работы с сертификатами
sudo apt install openssl -y
# Включаем SSL-модуль Apache
sudo a2enmod ssl
sudo a2enmod rewrite
# Перезапускаем Apache
sudo systemctl restart apache2
# Проверяем статус
sudo systemctl status apache2
Если всё прошло успешно, Apache должен быть запущен и готов к работе. Теперь можно переходить к созданию сертификата.
Создание самоподписанного сертификата
Есть несколько способов создать самоподписанный сертификат. Рассмотрим самый простой и быстрый — в одну команду.
# Создаём директорию для сертификатов
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
Система попросит ввести информацию о сертификате. Вот пример заполнения:
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.local
Email Address []: admin@example.local
Важно: В поле “Common Name” обязательно укажите доменное имя или IP-адрес вашего сервера. Это критично для правильной работы SSL.
Для автоматизации можно использовать параметр -subj:
sudo 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=My Company/OU=IT Department/CN=example.local/emailAddress=admin@example.local"
Проверим созданные файлы:
# Проверяем права доступа
sudo chmod 600 /etc/ssl/private/apache-selfsigned.key
sudo chmod 644 /etc/ssl/certs/apache-selfsigned.crt
# Смотрим информацию о сертификате
sudo openssl x509 -in /etc/ssl/certs/apache-selfsigned.crt -text -noout
Настройка Apache для SSL
Теперь настроим Apache для работы с нашим сертификатом. Создадим конфигурационный файл для SSL-хоста:
# Создаём конфигурацию для SSL-сайта
sudo nano /etc/apache2/sites-available/default-ssl.conf
Вставляем следующую конфигурацию:
<IfModule mod_ssl.c>
    <VirtualHost *:443>
        ServerName example.local
        DocumentRoot /var/www/html
        # Логи
        ErrorLog ${APACHE_LOG_DIR}/ssl_error.log
        CustomLog ${APACHE_LOG_DIR}/ssl_access.log combined
        # SSL конфигурация
        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
    </VirtualHost>
</IfModule>
Также настроим редирект с HTTP на HTTPS:
# Редактируем основной конфиг
sudo nano /etc/apache2/sites-available/000-default.conf
Добавляем редирект:
<VirtualHost *:80>
    ServerName example.local
    DocumentRoot /var/www/html
    # Редирект на HTTPS
    RewriteEngine On
    RewriteCond %{HTTPS} off
    RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
</VirtualHost>
Активируем сайт и необходимые модули:
# Включаем модуль headers для заголовков безопасности
sudo a2enmod headers
# Активируем SSL-сайт
sudo a2ensite default-ssl
# Проверяем конфигурацию
sudo apache2ctl configtest
# Если всё OK, перезапускаем Apache
sudo systemctl restart apache2
Создание продвинутого сертификата с SAN
Для более сложных сценариев можно создать сертификат с поддержкой нескольких доменов (Subject Alternative Names). Это полезно, если у вас несколько поддоменов или вы хотите, чтобы сертификат работал и с IP-адресом.
Создаём конфигурационный файл:
sudo nano /tmp/ssl.conf
Содержимое файла:
[req]
default_bits = 2048
prompt = no
default_md = sha256
req_extensions = req_ext
distinguished_name = dn
[dn]
C = RU
ST = Moscow
L = Moscow
O = My Company
OU = IT Department
CN = example.local
[req_ext]
subjectAltName = @alt_names
[alt_names]
DNS.1 = example.local
DNS.2 = www.example.local
DNS.3 = api.example.local
DNS.4 = admin.example.local
IP.1 = 192.168.1.100
IP.2 = 127.0.0.1
Генерируем сертификат с этими параметрами:
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
    -keyout /etc/ssl/private/apache-selfsigned.key \
    -out /etc/ssl/certs/apache-selfsigned.crt \
    -config /tmp/ssl.conf
Тестирование и диагностика
После настройки важно проверить, что всё работает корректно. Вот несколько полезных команд для диагностики:
# Проверяем, что Apache слушает на порту 443
sudo netstat -tlnp | grep :443
# Тестируем SSL соединение
openssl s_client -connect example.local:443 -servername example.local
# Проверяем сертификат через curl
curl -I -k https://example.local
# Детальная информация о сертификате
echo | openssl s_client -servername example.local -connect example.local:443 2>/dev/null | openssl x509 -text -noout
Если возникают проблемы, проверьте логи Apache:
# Основные логи
sudo tail -f /var/log/apache2/error.log
sudo tail -f /var/log/apache2/ssl_error.log
# Проверяем конфигурацию SSL
sudo apache2ctl -S
Сравнение различных подходов
| Метод | Плюсы | Минусы | Когда использовать | 
|---|---|---|---|
| Простой самоподписанный | Быстро, просто | Только один домен | Простые тестовые сайты | 
| С SAN | Множество доменов, IP | Сложнее настройка | Комплексные dev-среды | 
| Let’s Encrypt | Бесплатно, доверенный CA | Нужен публичный домен | Production-сайты | 
| Коммерческий | Максимальное доверие | Стоит денег | Корпоративные проекты | 
Автоматизация и скрипты
Для автоматизации процесса можно создать bash-скрипт. Вот пример скрипта для массового создания сертификатов:
#!/bin/bash
# ssl-cert-generator.sh
DOMAIN=${1:-example.local}
CERT_DIR="/etc/ssl/certs"
KEY_DIR="/etc/ssl/private"
CERT_FILE="${CERT_DIR}/${DOMAIN}.crt"
KEY_FILE="${KEY_DIR}/${DOMAIN}.key"
echo "Создание SSL сертификата для ${DOMAIN}"
# Создаём директории
sudo mkdir -p ${CERT_DIR} ${KEY_DIR}
# Генерируем сертификат
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
    -keyout ${KEY_FILE} \
    -out ${CERT_FILE} \
    -subj "/C=RU/ST=Moscow/L=Moscow/O=Dev Company/OU=IT/CN=${DOMAIN}"
# Устанавливаем права
sudo chmod 600 ${KEY_FILE}
sudo chmod 644 ${CERT_FILE}
echo "Сертификат создан:"
echo "Certificate: ${CERT_FILE}"
echo "Private Key: ${KEY_FILE}"
# Проверяем сертификат
sudo openssl x509 -in ${CERT_FILE} -text -noout | grep -E "(Subject|Not After)"
Использование скрипта:
chmod +x ssl-cert-generator.sh
sudo ./ssl-cert-generator.sh mydomain.local
Интеграция с Docker и контейнерами
Самоподписанные сертификаты отлично работают в Docker-контейнерах. Можно создать образ с предустановленными сертификатами:
# Dockerfile
FROM ubuntu:24.04
RUN apt-get update && apt-get install -y \
    apache2 \
    openssl \
    && rm -rf /var/lib/apt/lists/*
# Копируем сертификаты
COPY ssl-cert-generator.sh /usr/local/bin/
COPY apache-ssl.conf /etc/apache2/sites-available/
# Включаем SSL
RUN a2enmod ssl && a2enmod rewrite
EXPOSE 80 443
CMD ["apache2ctl", "-D", "FOREGROUND"]
Для работы с VPS-серверами такой подход особенно удобен — можно быстро разворачивать тестовые среды с SSL.
Работа с мобильными устройствами
Интересный факт: для тестирования мобильных приложений с самоподписанными сертификатами нужно добавить сертификат в доверенные на устройстве. Для Android это делается через Settings → Security → Install certificates.
Для iOS процесс сложнее — нужно отправить сертификат по email, установить его, а затем включить в Settings → General → About → Certificate Trust Settings.
Мониторинг и обслуживание
Не забывайте отслеживать срок действия сертификатов. Простой скрипт для мониторинга:
#!/bin/bash
# check-ssl-expiry.sh
CERT_FILE="/etc/ssl/certs/apache-selfsigned.crt"
DAYS_WARN=30
if [ ! -f "$CERT_FILE" ]; then
    echo "Сертификат не найден: $CERT_FILE"
    exit 1
fi
EXPIRY_DATE=$(openssl x509 -in "$CERT_FILE" -noout -enddate | cut -d= -f2)
EXPIRY_EPOCH=$(date -d "$EXPIRY_DATE" +%s)
CURRENT_EPOCH=$(date +%s)
DAYS_LEFT=$(( ($EXPIRY_EPOCH - $CURRENT_EPOCH) / 86400 ))
if [ $DAYS_LEFT -lt $DAYS_WARN ]; then
    echo "ВНИМАНИЕ: Сертификат истекает через $DAYS_LEFT дней!"
    echo "Дата истечения: $EXPIRY_DATE"
else
    echo "Сертификат действителен ещё $DAYS_LEFT дней"
fi
Добавьте этот скрипт в cron для автоматической проверки:
# Проверяем каждый день в 9:00
0 9 * * * /usr/local/bin/check-ssl-expiry.sh
Альтернативные решения
Помимо OpenSSL, есть и другие инструменты для создания сертификатов:
- mkcert — удобная утилита для создания локальных CA (https://github.com/FiloSottile/mkcert)
 - easyrsa — часть OpenVPN, но можно использовать отдельно
 - cfssl — инструмент от CloudFlare для работы с PKI
 
Пример использования mkcert:
# Установка mkcert
curl -JLO "https://dl.filippo.io/mkcert/latest?for=linux/amd64"
chmod +x mkcert-v*-linux-amd64
sudo mv mkcert-v*-linux-amd64 /usr/local/bin/mkcert
# Создание локального CA
mkcert -install
# Генерация сертификата
mkcert example.local localhost 127.0.0.1 ::1
Безопасность и лучшие практики
Несколько важных моментов по безопасности:
- Права доступа: приватные ключи должны быть доступны только root (600)
 - Длина ключа: используйте минимум 2048 бит, лучше 4096
 - Алгоритмы: избегайте SHA-1, используйте SHA-256 или выше
 - Срок действия: не делайте сертификаты слишком долгоживущими
 
Для выделенных серверов рекомендую создавать отдельные сертификаты для каждого сервиса и регулярно их обновлять.
Интеграция с CI/CD
В DevOps-процессах самоподписанные сертификаты можно генерировать автоматически. Пример для GitLab CI:
generate_ssl:
  stage: prepare
  script:
    - apt-get update && apt-get install -y openssl
    - mkdir -p ssl/
    - openssl req -x509 -nodes -days 365 -newkey rsa:2048 
      -keyout ssl/server.key -out ssl/server.crt 
      -subj "/C=RU/ST=Moscow/L=Moscow/O=CI/CN=test.local"
  artifacts:
    paths:
      - ssl/
    expire_in: 1 hour
Заключение и рекомендации
Самоподписанные SSL-сертификаты — это мощный инструмент для разработки и тестирования. Они не заменят полноценные сертификаты в production, но для dev-окружения, staging-серверов и внутренних проектов — это идеальное решение.
Когда использовать самоподписанные сертификаты:
- Локальная разработка и тестирование
 - Внутренние корпоративные сервисы
 - Staging-среды
 - Домашние лаборатории
 - Обучение и эксперименты
 
Когда НЕ использовать:
- Публичные сайты
 - Коммерческие проекты
 - Anywhere, где важно доверие пользователей
 - API для внешних клиентов
 
Помните: самоподписанные сертификаты обеспечивают шифрование, но не аутентификацию. Для production-среды всегда используйте сертификаты от доверенных CA или Let’s Encrypt.
Ubuntu 24 отлично подходит для таких экспериментов — система стабильная, Apache работает без проблем, а OpenSSL достаточно свежий для всех современных криптографических стандартов. Удачи в настройке!
В этой статье собрана информация и материалы из различных интернет-источников. Мы признаем и ценим работу всех оригинальных авторов, издателей и веб-сайтов. Несмотря на то, что были приложены все усилия для надлежащего указания исходного материала, любая непреднамеренная оплошность или упущение не являются нарушением авторских прав. Все упомянутые товарные знаки, логотипы и изображения являются собственностью соответствующих владельцев. Если вы считаете, что какой-либо контент, использованный в этой статье, нарушает ваши авторские права, немедленно свяжитесь с нами для рассмотрения и принятия оперативных мер.
Данная статья предназначена исключительно для ознакомительных и образовательных целей и не ущемляет права правообладателей. Если какой-либо материал, защищенный авторским правом, был использован без должного упоминания или с нарушением законов об авторском праве, это непреднамеренно, и мы исправим это незамедлительно после уведомления. Обратите внимание, что переиздание, распространение или воспроизведение части или всего содержимого в любой форме запрещено без письменного разрешения автора и владельца веб-сайта. Для получения разрешений или дополнительных запросов, пожалуйста, свяжитесь с нами.