Если
действительно доверяем УЦ, то непонятно зачем потом сертификат под микроскопом разглядывать и создавать себе лишнюю работу. УЦ уже проверил сервер и не выявил несоответствий. Наличие ключа соответствующего сертификату необходимо для установления успешного соединения. Подпись сертификата сервера проверена по сертификату УЦ. То есть проверив цепочку сертификатов мы знаем, что владелец сервера правомерно получил сертификат в доверенном УЦ и имеет ключ, соответствующий сертификату. Чего еще надо? Чтобы влезть в середину и не спалиться на самой цепочке сертификатов мошенники должны либо подкупить доверенный УЦ либо добавить свой УЦ в доверенные либо украсть закрытый ключ сервера либо украсть закрытый ключ доверенного УЦ. Антивирусы с MiTM на этом и палятся.
Но тем не менее браузеры все равно сомневаются в каждом конкретном сертификате и после проверки цепочки, а вдруг назвались кем-то другим. Да пусть сервер мошенников хоть горшком назовется, если у нас DNS/hosts на него не указывает, то "кина не будет". Если соединение есть, то DNS нам уже указал на конкретный IP. И если мошенники украдут ключи или пропишут свой УЦ доверенным, то уж подделать ответ DNS или вирусом прописать адрес в hosts им труда не составит. Поэтому проверки CN и SAN браузером фундаментально просто подстраховка "на всякий случай", нет существенного смысла писать длинные и детальные проверки имени сервера. Проверка политик УЦ и назначения сертификата гораздо важнее чем соответствие имени. Проверки цепочки доверия, подписей сертификатов в цепочке, проверка отзыва сертификатов - это максимум чего браузер может реально проверить и гарантировать. Все остальное - куча условностей и реклама "вот мы такие супер-безопасные, у нас 100500 проверок".
Приведите, пожалуйста, пример ситуации в котором браузер действительно отклонил сертификат мошенников, прошедший проверку цепочки сертификатов? Ошибки конфигурации (когда зашли на сервер по адресу не включенному в CN/SAN) не считаем. Совсем наглые MiTM, палящиеся на проверке цепочки сертификатов тоже. За примерами, в которых браузеры отклонили правомерный сертификат сервера, ходить далеко не надо - сами видите сколько возражений пользователей. Для интереса можно бы составить матрицу и посчитать коэффициент корреляции. Логически приходим к выводу, что можно выкинуть не только "проблемный" код, проверяющий CN, но "безупречный" код, проверяющий SAN. Так будет еще проще для разработчиков браузеров - просто всегда ОК.
Ну хорошо если с проверками CN и SAN "безопаснее" - пусть будут. Мне что-то тоже не понятно про какие именно нестрогие проверки CN идет речь, тем более об их большом объеме. На самом деле, если смотреть в код почти любой программы, то 40% кода тупые базовые функции, написанные в самых первых версиях (не учитывающие нюансы, но охватывающие 80-85% случаев), а 60% кода это уточнения даталей, добавленные в следующих 100500 версиях (для 15-20% экзотических случаев). Если так важно упрощение, то можно выкинуть неиспользуемые большинством детали. Согласитесь, мало серверов реально использует все формы записи IP, маски IP и т.д. Проверки десятичного IP, обработки звездочки в имени сервера и строго соответствия имени сервера достаточно для проверки большинства сертификатов серверов.
Я бы выстроил алгоритм так:
1. Нет "Аутентификация сервера" - выкидываем ошибку. Иначе пункт 2.
2. Есть SAN с элементами DNS и/или IP - проверяем SAN, CN игнорируем. Иначе пункт 3.
3. Проверка политик. Если УЦ заявил политику о невключении имени хоста в CN (согласно стандартам DV OV EV УЦ обязан заявить какую-либо политику о соответствии сертификата стандарту, то есть списочек политик УЦ у браузера все равно есть, помечаем в списочке наличие пункта о невключении хоста в CN) и такая политика включена в сертификат - выкидываем ошибку. Если никакой политики не заявлено УЦ, то можно придраться, что сертификат даже не DV и отклонить на этом основании. Иначе пункт 4.
4. Форма CN = IP в десятичной форме - сравниваем с адресом сервера. При соответствии - возвращаем ОК, при несоответствии ошибку. Если форма CN "не похожа на IP" - пункт 5.
5. Если есть * в начале, то сравниваем конец имени сервера - при несоответствии ошибка, при соответствии ОК. Нет звездочки - пункт 6.
6. Сравниваем CN с именем сервера - при несовпадении не копаем почему и выкидываем ошибку. При совпадении - возвращаем ОК. Конец.
УЦ, которые не заявили никакую политику можно потихоньку выкидывать из доверия. Для любителей экзотических форм IP - перевыпуск с SAN.
Какие-то интересные требования по обоснованию, с точки зрения разработчиков, будто они одни в мире. Пользователей и владельцев серверов намного больше - меньшинство диктует большинству?
1) Перевыпуск сертификата требует материальных затрат со стороны владельцев серверов. Из-за повального распространения хостингов, сертификат заменить порой не так уж и просто. Поэтому перевыпуск сертификатов серверов идет со скрипом и года явно недостаточно. Легко представить, что причиной отключения CN были не сложности проверки и заботы о безопасности, а просто проплата со стороны группы УЦ в Гугл и ключевым разработчикам мозиллы.
2) Что касается отечественных УЦ, то они все еще ссылаются на неведомые требования, которые им не дают выпустить с SAN. Пересмотрел указ ФСБ и не нашел там запрета указания лишних полей в SAN. Однако пока "свыше" не придет разъяснение УЦ не станут чего либо выпускать по-другому, ведь это требует изменения регламента УЦ и либо переаккредитации либо потенциального риска что УЦ просто прикроют. Бог с остальным миром, но наверно надо учитывать российские реалии при выпуске браузера с ГОСТ.
3) Как бы не были хороши "стандартизированные поля" SAN, браузеры их все еще не могут полноценно обработать при наличии большого количества таких полей в сертификате. Предлагаю эксперимент - создать сертификат с 8-10 SAN и попробовать зайти на сайт по каждому из указанных в SAN адресов/айпи. В моем случае такой сертификат от внутреннего УЦ с использованием адресов локальной сети и доменов .LOCAL - такие элементы SAN недопустимы для общепризнанных доверенных УЦ и потому сертификат наверно не годится для чистого эксперимента. Мозилла 60 не смогла признать все адреса, ХромиумГост еще не тестировал по всему списку.
Отредактировано пользователем 8 августа 2018 г. 12:21:54(UTC)
| Причина: уточнение