Восстановить проверенный доступ к сайту справки

КибербезопасностьBeginner
Практиковаться сейчас

Введение

Команда поддержки развернула сайт справки, но клиенты отклоняют HTTPS-соединение. HTTPS использует TLS для шифрования трафика и подтверждения личности ответившего сервера. Одного шифрования недостаточно: клиент также должен распознать запрошенное имя и доверять издателю сертификата.

Вы исправите синтетические учебные сертификаты на настоящем сервере Nginx. Достаточно базового владения терминалом; проверка сертификатов и настройка службы объясняются здесь. Client и Server — отдельные сеансы и каталоги одной VM, а не разные компьютеры. Nginx работает в подготовленном контейнере. Необязательный HTTPS Monitor показывает реальные внутренние TLS-проверки; значок замка браузера относится к другому, внешнему соединению.

Получить доверенный эталонный документ

На этом шаге получите документ работающей службы, затем сравните её с неисправным сайтом справки. Имя хоста обозначает запрашиваемую службу. Все учебные имена оканчиваются на .lab.test и действуют только в этом упражнении.

Используйте вкладку Client. curl получает содержимое URL. --cacert root.crt доверяет предоставленному центру сертификации (CA), подписывающему сертификаты. Это учебная точка доверия, а не общедоступный CA. --resolve сопоставляет имя и порт с IP-адресом, сохраняя имя для TLS и HTTP. 127.0.0.1 обозначает эту VM; порт 8443 ведёт к подготовленному Nginx. --noproxy '*' отправляет запрос напрямую; кавычки запрещают оболочке раскрывать *. --fail считает HTTP-ошибки неудачей, а --output сохраняет настоящий документ службы для дальнейшего использования.

curl --noproxy '*' --fail --cacert root.crt --resolve status.lab.test:8443:127.0.0.1 --output reference.txt https://status.lab.test:8443/

cat показывает содержимое файла:

cat reference.txt
status service: training content available

Это реально загруженный эталонный документ, а не отчёт. Теперь запросите предусмотренное имя сайта справки. Следующая команда должна завершиться ошибкой и вернуть приглашение; после этого продолжайте.

curl --noproxy '*' --cacert root.crt --resolve help.lab.test:8443:127.0.0.1 https://help.lab.test:8443/
curl: (60) SSL: no alternative certificate subject name matches target host name 'help.lab.test'
...

Эталон работал с теми же CA и адресом. Эта ошибка указывает именно на несовпадение имени, а не на остановленный сервер. Сохраните ожидаемое имя: изменение URL проверит другую личность.

Исследовать и собрать цепочку сертификатов

На этом шаге сравните выдаваемую сервером личность с подготовленным сертификатом и создайте пригодный серверный набор. Сертификат содержит открытый ключ и сведения о личности. Соответствующий закрытый ключ остаётся на сервере. Никогда не вставляйте его в отчёт и не отправляйте клиентам.

В Client исследуйте фактически выдаваемый сертификат. openssl s_client открывает TLS-соединение; -connect задаёт адрес, а -servername передаёт запрошенное имя через Server Name Indication (SNI), позволяя одному слушателю Nginx обслуживать несколько сайтов. < /dev/null завершает интерактивный ввод. 2>/dev/null скрывает диагностику соединения только для этого просмотра. Конвейер | передаёт сертификат в openssl x509; -noout скрывает закодированный сертификат, остальные параметры показывают нужные поля. Сам просмотр ещё не доказывает доверие.

openssl s_client -connect 127.0.0.1:8443 -servername help.lab.test </dev/null 2>/dev/null | openssl x509 -noout -subject -issuer -dates -ext subjectAltName
subject=CN = legacy.lab.test
issuer=CN = LabEx Training Issuing CA
notBefore=...
notAfter=...
X509v3 Subject Alternative Name:
    DNS:legacy.lab.test

Альтернативное имя субъекта (SAN) перечисляет допустимые имена хостов. issuer обозначает подписавший CA; даты ограничивают срок действия. При подготовке создаются новые сертификаты для этой VM: конечные сертификаты действуют 365 дней. Верная дата не компенсирует неверное имя.

Перейдите в Server. openssl x509 -in читает локальный сертификат вместо сетевого ответа:

openssl x509 -in certs/help.crt -noout -subject -issuer -dates -ext subjectAltName

Его SAN — DNS:help.lab.test, что совпадает с запросом. Предусмотрены следующие связи:

Элемент Назначение
help.crt и help.key Сертификат справки и соответствующий закрытый ключ
docs.crt и docs.key Сертификат документации и соответствующий закрытый ключ
issuing.crt Промежуточный CA, подписавший оба сайта
../client/root.crt Корневой CA, которому доверяет клиент

Цепочка: сертификат сайта → промежуточный CA → доверенный корневой CA. Nginx должен сначала отправлять конечный сертификат, затем промежуточный. Клиент уже доверяет корню, отправлять его необязательно. Соберите публичный набор командой cat; > записывает вывод в файл, заменяя прежнее содержимое. Закрытый ключ в этот набор не входит.

cat certs/help.crt certs/issuing.crt > certs/help-fullchain.pem

openssl verify проверяет набор относительно указанного доверенного корня. -untrusted предоставляет промежуточные сертификаты как возможные звенья, а не дополнительные доверенные корни; -verify_hostname проверяет нужное имя.

openssl verify -CAfile ../client/root.crt -untrusted certs/help-fullchain.pem -verify_hostname help.lab.test certs/help-fullchain.pem
certs/help-fullchain.pem: OK

При ошибке проверьте порядок входных файлов и написание имён, затем повторите cat. Это проверяет подготовленный набор; работающий сервер ещё должен начать его использовать.

Применить личность сайта справки

На этом шаге настройте выдачу правильной личности Nginx, сохранив работу сайта статуса. В Server покажите конфигурацию через cat:

cat conf/help.conf

server_name выбирает сайт. ssl_certificate указывает публичную цепочку, ssl_certificate_key — закрытый ключ. Пути с /tls/ находятся внутри подготовленного контейнера Nginx и соответствуют местному certs/. Строка return 200 выдаёт настоящее учебное содержимое справки. Сохраните слушатель, имя и ответ.

Откройте файл текстовым редактором nano:

nano conf/help.conf

Стрелками найдите две директивы TLS. Замените только эти две строки:

    ssl_certificate /tls/help-fullchain.pem;
    ssl_certificate_key /tls/help.key;

Точки с запятой завершают директивы Nginx. Сохраните через Ctrl+O, нажмите Enter, выйдите через Ctrl+X. При опечатке в пути снова откройте этот файл и исправьте её.

sudo запускает команду с административными правами. docker exec https-edge выполняет следующую команду внутри подготовленного контейнера службы. nginx -t проверяет конфигурацию, не применяя её:

sudo docker exec https-edge nginx -t

Найдите syntax is ok и test is successful. При ошибке сначала исправьте указанные файл и строку. nginx -s reload просит работающую службу перечитать проверенную конфигурацию:

sudo docker exec https-edge nginx -s reload

Переключитесь в Client и повторите нужный запрос. Перезагрузка конфигурации может занять мгновение; повторите запрос, если ещё виден старый сертификат.

curl --noproxy '*' --fail --cacert root.crt --resolve help.lab.test:8443:127.0.0.1 https://help.lab.test:8443/
help service: training content available

Сохраните и нормальную работу эталонного сайта:

curl --noproxy '*' --fail --cacert root.crt --resolve status.lab.test:8443:127.0.0.1 https://status.lab.test:8443/

Успех означает проверку реальных имени, цепочки и срока действия до принятия ответа справки. Редактирование неиспользуемого сертификата такого результата не даст.

Исправить отсутствие промежуточного сертификата

На этом шаге отличите неполную цепочку от уже исправленного несовпадения имени. В Client запросите подготовленный сайт документации. Эта ошибка ожидается:

curl --noproxy '*' --cacert root.crt --resolve docs.lab.test:8443:127.0.0.1 https://docs.lab.test:8443/
curl: (60) SSL certificate problem: unable to get local issuer certificate
...

В обоих случаях код завершения 60; читайте сопровождающее объяснение. Исследуйте выдаваемый сертификат той же формой команды:

openssl s_client -connect 127.0.0.1:8443 -servername docs.lab.test </dev/null 2>/dev/null | openssl x509 -noout -subject -issuer -dates -ext subjectAltName

Теперь SAN — DNS:docs.lab.test. Имя верное, но Nginx отправляет только конечный сертификат: клиент не может связать его издателя с корнем.

Для одного контролируемого сравнения -k отключает проверку сертификата. Это показывает, что содержимое доступно даже при нарушенном доверии:

curl --noproxy '*' -k --resolve docs.lab.test:8443:127.0.0.1 https://docs.lab.test:8443/

Получение docs service: training content available здесь не является исправлением. Вернитесь в Server, просмотрите активный файл и откройте его:

cat conf/docs.conf
nano conf/docs.conf

Подготовленный docs-fullchain.pem уже содержит конечный и промежуточный сертификаты в нужном порядке. Замените только строку ssl_certificate:

    ssl_certificate /tls/docs-fullchain.pem;

Оставьте /tls/docs.key закрытым ключом. Сохраните и выйдите, как прежде, затем проверьте и перечитайте настройки:

sudo docker exec https-edge nginx -t
sudo docker exec https-edge nginx -s reload

В Client запросите все три предусмотренных имени без -k. Цикл последовательно присваивает значения переменной host; $host подставляет значение, двойные кавычки сохраняют целостность каждого аргумента.

for host in help docs status; do
  curl --noproxy '*' --fail --cacert root.crt --resolve "$host.lab.test:8443:127.0.0.1" "https://$host.lab.test:8443/"
done

Ожидаются три соответствующих ответа службы. Можно обновить HTTPS Monitor и сравнить независимые живые проверки. Исправляйте ошибку в нужной конфигурации, тестируйте и перечитывайте её; не меняйте клиентский корень доверия или ожидаемые имена. В реальных развёртываниях получайте утверждённые сертификаты через процесс вашей организации; здесь даны синтетические кандидаты, чтобы сосредоточиться на диагностике.

Резюме

Вы получили доверенный эталон, исследовали реальные имена и издателей сертификатов, собрали конечный и промежуточный сертификаты и применили их проверенным перечитыванием Nginx. Вы исправили несовпадение имени и неполную цепочку, сохранив нормальную работу. Следующее испытание объединяет эти решения для другого портала.