Перейти к содержанию

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. - Сделан вывод о доверии к самоподписанным сертификатам.

Что включить в отчёт

  1. IP-адрес Linux-сервера.
  2. Конфигурацию веб сервера.
  3. Содержимое созданной HTML-страницы.
  4. Результат проверки nginx -t.
  5. Скриншот открытого сайта в браузере.
  6. Скриншот предупреждения о сертификате.
  7. Сведения о сертификате: субъект, издатель и срок действия.
  8. Результаты проверки через openssl s_client.
  9. Объяснение разницы между HTTP и HTTPS.
  10. Вывод о том, почему самоподписанный сертификат не считается автоматически доверенным.