January 25, 2023

Localhost в опасности, или на Кинг-Стрит опять раздают SSL-сертификаты

Дело было в феврале 2019 года, когда некто сэр Нова Альтэс из Манчестера, его величества Соединенного Королевства, в одно воскресное и, непременно, дождливое британское утро, обзавелся новеньким SSL-сертификатом на имеющийся в его распоряжении домен localhost.direct. Однако приобретенный набор криптографических последовательностей сэр Альтэс намеревался использовать отнюдь не в целях безопасности личной коллекции Интернет-ресурсов, а в целях весьма благородных — пожертвовать приватный ключ мировому сообществу веб-разработчиков. И вот уже три года подряд сэр Альтэс исправно вносит весьма приличную для обычного программиста из северной Англии сумму фунтов стерлингов на счет центра сертификации Google Trust Services LLC, который, в свою очередь, с большой охотой продлевает срок действия сертификата еще на 12 месяцев, после чего мистер Нова загружает свежий приватный ключ в открытый доступ.

Что же такого особенного заключается в этом самом сертификате, и чем он может быть полезен сообществу IT? Для ответа на этот вопрос давайте обратим внимание на домен, для которого искомый сертификат, предназначается, а именно — localhost.direct:

$ nslookup localhost.direct
...
Non-authoritative answer:
Name:	localhost.direct
Address: 127.0.0.1

Аналогичный ответ от DNS мы получаем при проверке любого сабдомена следующего уровня:

$ nslookup whatever.localhost.direct
...
Non-authoritative answer:
Name:	whatever.localhost.direct
Address: 127.0.0.1

Нетрудно догадаться, что сэр Альтэс позаботился о том, чтобы домен localhost.direct, ровно как и любой домен, подходящий под маску *.localhost.direct , вели на 127.0.0.1, то есть на сетевой интерфейс внутренней петли, он же localhost. Поскольку соответствующие DNS-записи внесены в публичную базу DNS, а ключ SSL-сертификата находится в свободном доступе, — любой желающий имеет возможность защитить свой собственный localhost сертификатом, выданным авторитетным центром.

Демо

Скачаем с ресурса сэра Альтэса подписанный сертификат вместе с ключом и положим их в директорию ~/localhost.direct:

$ mkdir -p ~/localhost.direct
$ curl -o certs.zip -LOs https://aka.re/localhost
$ unzip -P localhost certs.zip
$ rm certs.zip
$ ls
localhost.direct.crt localhost.direct.key

Создадим простой nginx.conf:

Запустим контейнер nginx:alpine, подложив внутрь nginx.conf, подписанный сертификат и его ключ:

$ docker run --rm \
-v $PWD/nginx.conf:/etc/nginx/conf.d/default.conf \
-v $PWD/localhost.direct.crt:/etc/nginx/certs/localhost.direct.crt \
-v $PWD/localhost.direct.key:/etc/nginx/certs/localhost.direct.key \
-p 80:80 \
-p 443:443 \
nginx:alpine

Откроем https://localhost.direct в браузере. Сертификат работает.

— Вы уже скучаете по боли от самоподписанных сертификатов и паническим надписям «Connection is not secure»?

Пример роутинга по сабдоменам:

Результат:

Идея проекта localhost.direct максимально проста и изящна. Kudos, сэр Альтэс!

Официальная страница проекта: https://get.localhost.direct.

Подпишись на телеграм «чевопса»

https://t.me/chevops

Девопс глазами программиста 👨‍💻

Практические примеры работы с Docker 🐳, Kubernetes ☸️ и облаками ☁️

Доступно, по делу, с юмором 🤡