- Home »

Как создать самоподписанный 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
- Логи Apache —
sudo 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. Но для внутренних задач и разработки самоподписанные сертификаты — отличное решение, которое можно развернуть за несколько минут.
Помните о безопасности: защищайте закрытые ключи, используйте современные алгоритмы шифрования и регулярно обновляйте сертификаты. При правильном использовании самоподписанные сертификаты могут существенно ускорить процесс разработки и тестирования ваших веб-приложений.
В этой статье собрана информация и материалы из различных интернет-источников. Мы признаем и ценим работу всех оригинальных авторов, издателей и веб-сайтов. Несмотря на то, что были приложены все усилия для надлежащего указания исходного материала, любая непреднамеренная оплошность или упущение не являются нарушением авторских прав. Все упомянутые товарные знаки, логотипы и изображения являются собственностью соответствующих владельцев. Если вы считаете, что какой-либо контент, использованный в этой статье, нарушает ваши авторские права, немедленно свяжитесь с нами для рассмотрения и принятия оперативных мер.
Данная статья предназначена исключительно для ознакомительных и образовательных целей и не ущемляет права правообладателей. Если какой-либо материал, защищенный авторским правом, был использован без должного упоминания или с нарушением законов об авторском праве, это непреднамеренно, и мы исправим это незамедлительно после уведомления. Обратите внимание, что переиздание, распространение или воспроизведение части или всего содержимого в любой форме запрещено без письменного разрешения автора и владельца веб-сайта. Для получения разрешений или дополнительных запросов, пожалуйста, свяжитесь с нами.