О ssl-сертификатах
Недавно меня спросили - почему на сайте нет ssl-сертификата? На этот вопрос очень простой ответ - потому что он на нём нахер не нужен. Развёрнутый ответ под катом.
Этот сайт - полностью публичен, статичен и неинтерактивен. Здесь нечего защищать ssl-ем, потому что на сайт ничего не передаётся кроме http-запросов. Здесь нет никакой крамолы, прочтение которой вы могли бы хотеть скрыть.
Если вам нужен ssl, чтобы только порадоваться зелёному значку в адресной строке, то я могу вас поздравить - вы не сильно далеко ушли в развитии от той самой собаки Павлова.
Но как вы могли догадаться, я бы не писал целую заметку для выражения такой простой мысли. Моя мысль пошла дальше, и перекинулась на ситуацию с ssl-сертификатами вообще.
Думаю очевидно, что нынешняя система сертификатов - это в чистом виде бизнес по продаже воздуха.
Любой из сотен центров сертификации может выписать серт на абсолютно любой домен.
А типовое "безопасное" приложение, сверяющееся с ca_root_nss
его радостно сожрёт и подвоха не заметит.
Приложения, сверяющие хотя бы корневой сертификат, типа openvpn'а - скорее исключение из правил.
Даже после серии громких скандалов, связанных с подделкой сертификатов и липовой "верификацией", центры, уличённые в этом исключаются из доверенных с большой неохотой. 1, 2, 3, 4, 5, 6, 7 Насколько я знаю, из списка выкинули только WoSign. Об уголовном наказании владельцев и организаторов и говорить не приходится.
И за эту "безопасность" с вас просят вполне чувствительные деньги. За altname, за wildcard, за ваше имя в сертификате, прописанное в отдельном поле. За перевыпуск, за кроссподпись, за всё что можно придумать.
В последнее время даже самые тупые начали что-то такое подозревать, задавать неудобные вопросы типа "за что мы платим деньги", и на "замену" придумали1 ...letsencrypt. Который не решает НИ ОДНОЙ архитектурной проблемы существующий системы, но маскирует их магическим словом ХАЛЯВА. "Ха-ха, смотрите эти лохи до сих пор платят за сертификаты! Но я-то не такой, я-то умный, мне - бесплатно."2 Ну да, на какое-то время от продавцов воздуха отстанут. Только проблему это не снимает, а откладывает.
А вместе с тем, мы получаем:
- малый срок жизни сертификата. Можно оперативно нагнуть любого, кто не нравится владельцу Letsencrypt'а. Передаю привет любителям хранить всё в облаке, и свидетелей секты святой уверенности, что их никогда-никогда не нагнут. В этот момент особенно активно кивают головой любители музыки из вконтакта.
- "невыкидываемый" из
ca_root_nss
центр сертификации. Ну в самом деле кто его выкинет, если на него полинтернета завязано. Халява же. Это какajax.googleapis.com
на полдня положить - тоже всё раком встанет. - необходимость постоянно следить за обновлением сертификата. Потенциальное закручивание гаек в процедуре перевыдачи. Например поинтересуются вашим телефоном и паспортными данными. Вы же не будете судорожно вспоминать, где, когда и кому вы настраивали этот долбаный летсэнкрипт. А часики-то тикают. Проще выдать запрошенные данные. А потом ещё и ещё.
Правильным решением было бы развивать механизм доверия сертификатам на основе запоминания отпечатка, он же cert-pinning. Отпечаток запоминается при первом посещении, в дальнейшем - сверяется. Есть даже плагины, выполняющие ровно эту задачу. Подменить сертификат становится невозможно - кто-то да заметит и спросит в интернетах "менялся ли". Опционально можно развивать сервисы, аналогичные docracy для ToS: отслеживанию изменений.
Также, неплохо бы иметь возможность проверять серт к dns через SRV-запись, наподобие DKIM. Правда для этого нужно защитить dns от подмены. DNSSec, dnscrypt, что-нибудь из этой оперы.
P.S. Что-то я сегодня очень зол и саркастичен. Наверное не выспался.
Какие именно жидорептилоиды придумали и с чьей подачи - тема интересная, но выходит за рамки данной статьи. ↩
Срезать такого "прогрессивного" очень просто - достаточно спросить его, есть ли поддержка wildcardов или какой нынче из десятков acme-клиентов рабочий. Если "прогрессивных" поблизости больше одного, мгновенно возникает срач по лекалам "выбора лучшего дистрибутива линукса". ↩