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

Быстрые ссылки
- Сгенерировать и самоподписать SSL‑сертификат
- Настроить Apache для использования самоподписанного сертификата
Самоподписанные сертификаты часто применяют как простую альтернативу сертификатным центрам (CA) для внутренних сервисов или сайтов, которые не доступны широкой публике, но требуют шифрования. Ниже — пошаговая инструкция и рекомендации по безопасности и эксплуатации.
1. Сгенерировать и самоподписать SSL‑сертификат
Мы будем использовать утилиту openssl, которая обычно уже установлена (зависимость Apache). Если её нет, установите через менеджер пакетов. Для Debian/Ubuntu:
sudo apt-get install opensslГенерируем приватный ключ и самоподписанный сертификат (RSA 2048 бит, срок 365 дней):
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/apache.key -out /etc/ssl/certs/apache.crtПримечание: при запросе заполните поле Common Name — укажите IP‑адрес сервера или доменное имя (тот, по которому будете обращаться к сайту). Остальные поля можно оставить пустыми.
Пример полей, которые спросит openssl:
Country Name (2 letter code) []:
State or Province Name (full name) []:
Locality Name (eg, city) []:
Organization Name (eg, company) []:
Organizational Unit Name (eg, section) []:
Common Name (eg, fully qualified host name) []: your_ip_address
Email Address []:Файлы, которые будут созданы:
- Приватный ключ: /etc/ssl/private/apache.key
- Сертификат: /etc/ssl/certs/apache.crt
Они действительны 365 дней (параметр -days 365). Можете изменить срок на нужное число дней.
Diffie‑Hellman для Perfect Forward Secrecy
Чтобы включить Perfect Forward Secrecy (PFS), сгенерируйте параметры Diffie‑Hellman. Это увеличивает безопасность, однако требует Apache >= 2.4.8.
sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 4096Генерация может занять продолжительное время (в зависимости от CPU). Если сервер слабый, можно использовать 2048 вместо 4096, но 4096 предпочтительнее для длительной безопасности.
Важно: не удаляйте приватный ключ и защитите доступ к /etc/ssl/private/apache.key (права должны быть ограничены).
2. Настроить Apache для использования самоподписанного сертификата
Для удобства поместим общие параметры SSL в отдельный сниппет. Создайте файл:
sudo touch /etc/apache2/conf-available/ssl-params.confОткройте в редакторе и вставьте следующие строки (или обновите существующие):
SSLCipherSuite EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH
SSLProtocol All -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
SSLHonorCipherOrder On
Header always set X-Frame-Options DENY
Header always set X-Content-Type-Options nosniff
SSLCompression off
SSLUseStapling on
SSLStaplingCache "shmcb:logs/stapling-cache(150000)"
SSLSessionTickets Off
SSLOpenSSLConfCmd DHParameters "/etc/ssl/certs/dhparam.pem"Кратко о значениях:
- SSLCipherSuite и SSLProtocol: выключают слабые протоколы/шифры.
- Header …: устанавливают дополнительные заголовки безопасности.
- SSLUseStapling: ускоряет проверку статуса сертификата (OCSP) при наличии поддержки.
- SSLOpenSSLConfCmd DHParameters: подключает ранее сгенерированный dhparam.pem.
Если вы пропустили генерацию dhparam.pem, удалите или закомментируйте последнюю строку.
Обновление виртуального хоста SSL
Откройте файл виртуального хоста, обычно /etc/apache2/sites-available/default-ssl.conf, и укажите пути к сертификату и ключу:
SSLCertificateFile /etc/ssl/certs/apache.crt
SSLCertificateKeyFile /etc/ssl/private/apache.keyУбедитесь, что в конфиге указаны правильные директивы ServerName, ServerAdmin и DocumentRoot. Если вы создавали пустой файл, скопируйте туда соответствующие значения из текущих рабочих конфигураций.
Включение модулей и сайта, перезапуск Apache
На Debian/Ubuntu включите нужные модули и включите SSL‑сайт:
sudo a2enmod ssl headers rewrite
sudo a2ensite default-ssl
sudo systemctl reload apache2Если вы используете другую систему (CentOS/RHEL), используйте соответствующие команды для включения модулей и сервиса.
3. Перенаправление HTTP на HTTPS и открытие портов
Чтобы перенаправлять весь HTTP трафик на HTTPS, добавьте в основной конфиг Apache (/etc/apache2/apache2.conf) или в виртуальный хост правило перезаписи:
RewriteEngine On
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://www.yourdomain.com/$1 [R,L]Замените https://www.yourdomain.com на ваш домен или IP. Также можно использовать относительный подход с %{HTTP_HOST} для универсальности.
Откройте порт 443 в брандмауэре (HTTPS). Примеры:
- UFW:
sudo ufw allow 443/tcp- iptables (пример):
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPTЕсли сервер у провайдера (AWS, GCP, Azure), откройте HTTPS в security group / firewall через веб‑консоль.

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

Внимание: предупреждение не означает отсутствие шифрования. Трафик зашифрован, но браузер не может проверить подлинность эмитента сертификата. Это ключевое отличие от сертификата, выданного доверенным CA.
Когда самоподписанный сертификат подходит, а когда нет
- Подходит: внутренние сервисы, тестовые окружения, короткоживущие стенд‑инстансы, VPN‑интерфейсы.
- Не подходит: публичные сайты, сайты с оплатой/регистрацией пользователей, где важно доверие и проверка владельца домена.
Если нужен сертификат для публичного сайта, используйте бесплатные CA (например, Let’s Encrypt) или платные центры сертификации.
Практические рекомендации по безопасности
- Ограничьте права на приватный ключ:chmod 600 /etc/ssl/private/apache.key, владелец root.
- Регулярно обновляйте apache и openssl.
- Периодически регенерируйте ключи и dhparam по политике ротации ключей.
- Используйте HSTS (только если все поддомены и перенаправления корректны):
Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"- Для корпоративных окружений: создайте собственный корпоративный CA и добавьте его корень в доверенные корневые хранилища устройств — это устранит предупреждения браузера и позволит управлять сертификатами централизованно.
Контрольные списки (ролевая разбивка)
Sysadmin — быстрая проверка:
- Есть приватный ключ и сертификат в /etc/ssl/private и /etc/ssl/certs
- Права на приватный ключ ограничены (600)
- dhparam.pem сгенерирован и подключён (если нужен)
- Модули ssl, headers, rewrite включены
- Виртуальный хост с SSLCertificateFile/SSLCertificateKeyFile настроен
- Порт 443 открыт в брандмауэре и у провайдера
- Перенаправление HTTP→HTTPS работает
Разработчик/QA — проверка функциональности:
- Страница загружается по HTTPS
- Содержимое не блокируется смешанным контентом (mixed content)
- Заголовки безопасности установлены
- Приёмка TLS: используемые шифры и протоколы соответствуют политике
Методология быстрого развертывания (мини‑SOP)
- На тестовом сервере выполнить генерацию ключа и сертификата.
- Сгенерировать dhparam и сохранить в /etc/ssl/certs.
- Создать /etc/apache2/conf-available/ssl-params.conf и вставить параметры.
- Настроить виртуальный хост в sites-available и прописать пути к сертификатам.
- Включить модули и сайт, перезагрузить Apache.
- Проверить открытые порты, выполнить тест в браузере и инструментах (sslyze, openssl s_client).
- При успехе повторить на продакшн‑сервере с учётом ротации ключей.
Критерии приёмки
- Сайт корректно отвечает по HTTPS на порту 443.
- Браузер устанавливает защищённое соединение (несмотря на предупреждение о доверии).
- Сервер использует заданную конфигурацию шифров и включает PFS при наличии dhparam.
- Нет смешанного контента, все ресурсы загружаются по HTTPS.
Возможные проблемы и их решение
- “Permission denied” при чтении ключа: проверьте права и владельца файла.
- Долгая генерация dhparam: можно временно использовать 2048 бит или сгенерировать на более мощном хосте и перенести.
- Браузер продолжает предупреждать: это ожидаемо для самоподписанного сертификата; для устранения — доверить ваш CA корню устройств или использовать публичный CA.
Дополнительные инструменты и чек‑листы тестирования
- openssl s_client
openssl s_client -connect yourdomain.com:443 -showcerts- Проверить шифры и протоколы: использовать ssllabs.com или локально sslyze.
Сценарий отката (rollback) на случай проблем
- Если Apache не стартует после конфигурации — просмотрите логи: sudo journalctl -u apache2 или /var/log/apache2/error.log.
- Откат: восстановите резервную копию конфигурации /etc/apache2/sites-available/default-ssl.conf.orig и выполните sudo systemctl restart apache2.
- Если причина связана с правами ключа — временно удалите строки SSLCertificateFile/KeyFile из виртуального хоста и перезапустите Apache для восстановления работы HTTP.
Простая диаграмма принятия решения (Mermaid)
graph TD
A[Нужен сертификат?] -->|Публичный сайт| B[Использовать публичный CA 'Let's Encrypt']
A -->|Внутренний/тест| C[Самоподписанный сертификат]
C --> D{Требуется отсутствие предупреждений в браузере?}
D -->|Да| E[Развернуть корпоративный CA и добавить корень в устройства]
D -->|Нет| F[Использовать самоподписанный сертификат и принять исключение]Таблица совместимости и заметки по версиям
- Apache: PFS через SSLOpenSSLConfCmd с DHParameters доступен в Apache >= 2.4.8.
- OpenSSL: для современных шифров рекомендуется OpenSSL 1.1+.
- Браузеры: все современные браузеры показывают предупреждение для самоподписанных сертификатов.
Ключевые выводы
- Самоподписанный сертификат обеспечивает шифрование, но не предоставляет проверку идентичности.
- Для внутренних нужд это быстрый и пригодный вариант; для публичных сервисов используйте доверенный CA.
- Дополнительные меры — dhparam для PFS, жёсткие настройки шифров и ограничение доступа к приватному ключу.
Резюме:
- Создайте ключ и сертификат командой openssl req.
- Сгенерируйте dhparam для PFS.
- Настройте ssl-params.conf и виртуальный хост в Apache.
- Включите модули, откройте порт 443 и протестируйте.
Важное: всегда храните приватные ключи в защищённых местах и контролируйте доступ к ним.
Похожие материалы
Как вставлять символы в Word 2013
Стрелки в Microsoft Word: рисование и настройка
QR‑код для Google Docs — быстро и просто
Как безопасно почистить динамики iPhone
Как выделять текст в PowerPoint