12.2 Настройка веб-сервера с самоподписанным сертификатом
Цель задания
Развернуть веб-сервер Nginx в Linux, разместить собственную HTML-страницу, настроить защищённое HTTPS-соединение с использованием самостоятельно созданного сертификата и проверить результат в браузере.
Установка веб-сервера
Для выполнения задания используется Nginx (можно использовать Apache или Cady).
В Ubuntu или Debian выполните:
sudo apt update
sudo apt install nginx
В RED OS установите пакет Nginx с помощью доступного в системе менеджера пакетов.
Запустите веб-сервер:
sudo systemctl enable --now nginx
Проверьте состояние службы:
systemctl status nginx
Убедитесь, что служба находится в состоянии active (running).
Создание собственной веб-страницы
Создайте каталог для сайта:
sudo mkdir -p /var/www/certificate-lab
Создайте HTML-файл:
sudo nano /var/www/certificate-lab/index.html
Добавьте следующий код:
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Лаборатория сертификатов</title>
</head>
<body>
<h1>Мой первый HTTPS-сайт</h1>
<p>Веб-сервер успешно настроен.</p>
<p>Соединение проверяется в рамках учебной работы.</p>
</body>
</html>
Сохраните файл.
Установите права доступа:
sudo chmod 755 /var/www/certificate-lab
sudo chmod 644 /var/www/certificate-lab/index.html
Подготовка сертификата для сайта
Используйте сертификат и закрытый ключ, созданные в предыдущей части работы.
Предполагается, что они находятся в каталогах:
~/certificate-lab/certs/server.crt
~/certificate-lab/private/server.key
Для Nginx подготовьте отдельный каталог:
sudo mkdir -p /etc/nginx/ssl/certificate-lab
Скопируйте сертификат:
sudo install -m 644 \
~/certificate-lab/certs/server.crt \
/etc/nginx/ssl/certificate-lab/server.crt
Скопируйте закрытый ключ:
sudo install -m 600 \
~/certificate-lab/private/server.key \
/etc/nginx/ssl/certificate-lab/server.key
Проверьте права доступа:
sudo ls -l /etc/nginx/ssl/certificate-lab/
Закрытый ключ должен быть защищён от чтения обычными пользователями.
Настройка доменного имени
В предыдущей части работы сертификат был создан для имени:
server.example.test
Чтобы браузер мог обращаться к веб-серверу по этому имени, необходимо настроить разрешение имени в IP-адрес.
Узнайте адрес Linux-машины:
hostname -I
Выберите адрес, доступный с компьютера, на котором будет запускаться браузер.
На компьютере, где открыт браузер, добавьте запись в файл hosts.
В Linux этот файл находится по пути:
/etc/hosts
В Windows:
C:\Windows\System32\drivers\etc\hosts
Добавьте строку, заменив 192.168.1.50 реальным IP-адресом своего Linux-сервера:
192.168.1.50 server.example.test
Если браузер запущен на той же Linux-машине, используйте адрес самого сервера или настройте соответствующую локальную запись.
Важно: примерный адрес 192.168.1.50 нельзя копировать без проверки. Используйте адрес своей машины. Если работа выполняется в виртуальной машине, проверьте, что выбранный сетевой режим позволяет компьютеру с браузером подключаться к ней.
Настройка Nginx для HTTPS
Создайте конфигурационный файл:
sudo nano /etc/nginx/conf.d/certificate-lab.conf
Добавьте конфигурацию:
server {
listen 80;
server_name server.example.test;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name server.example.test;
root /var/www/certificate-lab;
index index.html;
ssl_certificate
/etc/nginx/ssl/certificate-lab/server.crt;
ssl_certificate_key
/etc/nginx/ssl/certificate-lab/server.key;
ssl_protocols TLSv1.2 TLSv1.3;
location / {
try_files $uri $uri/ =404;
}
}
В первой секции Nginx принимает HTTP-запросы и перенаправляет браузер на HTTPS.
Во второй секции:
- listen 443 ssl — включает обработку HTTPS-соединений;
- server_name — задаёт имя сайта;
- root — указывает каталог веб-страниц;
- index — задаёт главную страницу;
- ssl_certificate — указывает путь к сертификату;
- ssl_certificate_key — указывает путь к закрытому ключу;
- ssl_protocols — разрешает TLS 1.2 и TLS 1.3.
Проверьте конфигурацию:
sudo nginx -t
Если ошибок нет, примените изменения:
sudo systemctl reload nginx
При ошибке не переходите к следующему этапу, пока не исправите конфигурацию.
Проверка доступности веб-сервера
На Linux-сервере выполните:
curl -I http://server.example.test
Если имя разрешается правильно, сервер должен вернуть ответ с перенаправлением на HTTPS, обычно со статусом 301.
Теперь проверьте HTTPS:
curl -vk https://server.example.test/
Параметр -k позволяет curl продолжить соединение, несмотря на проблему доверия к сертификату. Он используется здесь исключительно для диагностики самоподписанного сертификата.
Обратите внимание на вывод команды и HTTP-статус ответа. При успешной работе веб-сервера должна вернуться HTML-страница.
Важно: -k не проверяет подлинность сертификата должным образом. Нельзя использовать его как постоянный способ подключения к реальным защищённым сервисам.
Проверка сайта через браузер
Откройте браузер на компьютере, который имеет сетевой доступ к Linux-серверу.
Введите адрес:
https://server.example.test
Если всё настроено правильно, должна открыться созданная HTML-страница.
При этом браузер, скорее всего, покажет предупреждение о недоверенном сертификате.
Причина в том, что сертификат был подписан самостоятельно, а не доверенным удостоверяющим центром, который уже находится в хранилище доверенных сертификатов браузера или операционной системы.
Не добавляйте сертификат в системное доверенное хранилище.
Проверка несоответствия доменного имени
Откройте сайт по IP-адресу:
https://192.168.1.50
Замените IP на адрес своего сервера.
Браузер должен обнаружить несоответствие имени, если IP-адрес не включён в SAN сертификата.
Сравните два варианта:
| Адрес | Ожидаемый результат |
|---|---|
https://server.example.test |
Имя соответствует сертификату, но сертификат может оставаться недоверенным |
https://IP-адрес-сервера |
Возможна ошибка несоответствия имени сертификата |
Объясните разницу между ошибкой доверия к издателю и ошибкой соответствия имени.
Проверка сертификата средствами OpenSSL
Выполните:
openssl s_client \
-connect server.example.test:443 \
-servername server.example.test \
-showcerts
Команда устанавливает TLS-соединение с сервером и выводит сведения о сертификате и результатах проверки цепочки доверия.
Найдите в выводе сведения о сертификате и строку Verify return code.
Для самоподписанного сертификата без доверенной цепочки ожидается ошибка проверки доверия. При этом TLS-соединение может быть успешно установлено: ошибка доверия не обязательно означает, что веб-сервер не работает.
Для проверки сертификата, сохранённого на диске, выполните:
openssl x509 \
-in /etc/nginx/ssl/certificate-lab/server.crt \
-noout -subject -issuer -dates
Сопоставьте сведения на диске с тем, что сервер предоставляет при подключении.
Итоговая проверка
Убедитесь, что выполнены все пункты: - Nginx установлен и запущен. - Создана собственная HTML-страница. - Созданный ранее сертификат подключён к Nginx. - Настроено перенаправление с HTTP на HTTPS. - Сайт открывается по доменному имени. - В браузере исследовано предупреждение о сертификате. - Проверены имя и срок действия сертификата. - Исследована ошибка при обращении по IP-адресу. - Выполнена проверка через OpenSSL. - Сделан вывод о доверии к самоподписанным сертификатам.
Что включить в отчёт
- IP-адрес Linux-сервера.
- Конфигурацию веб сервера.
- Содержимое созданной HTML-страницы.
- Результат проверки
nginx -t. - Скриншот открытого сайта в браузере.
- Скриншот предупреждения о сертификате.
- Сведения о сертификате: субъект, издатель и срок действия.
- Результаты проверки через
openssl s_client. - Объяснение разницы между HTTP и HTTPS.
- Вывод о том, почему самоподписанный сертификат не считается автоматически доверенным.