Про поддержку сайтов с национальными сертификатами в Яндекс Браузере
Очень много вопросов по этой теме. Оно и понятно: информации мало, противоречивых интерпретаций много. Для нас, как команды Яндекс Браузера, тема защиты соединений с сайтами близка. Мы пишем на Хабре об этом уже лет восемь. Например, в своё время мы первыми поддержали dnscrypt прямо в браузере, первыми начали предупреждать о неизвестных корневых сертификатах в системе, первыми включили шифрование трафика для незащищенных wifi-сетей.
Поэтому сегодня мы расскажем сообществу о происходящему чуть более подробно. Тем, кто очень спешит и хочет получить короткие ответы, достаточно прочитать начало поста. Поехали.
Коротко о главном
1. Национальный удостоверяющий центр выдаёт сертификаты на домены только тех организаций, которые явно это запросили. Полный список этих доменов публично доступен по адресу www.gosuslugi.ru/tls.
2. Яндекс Браузер применяет национальные сертификаты не для всего рунета, а только на тех сайтах, которые есть в списке на www.gosuslugi.ru/tls. Попытка применить его на других доменах приведёт к стандартной ошибке и недоступности сайта для пользователя.
3. Национальные сертификаты используют общепринятую открытую криптографию и работают по стандартным правилам (это обычный RSA с длинным ключом, ровно такой же, какой выписывают другие центры сертификации).
4. Мы работаем над поддержкой стандарта Certificate Transparency и планируем создать публичный лог, в который будут вноситься все выпускаемые национальным центром сертификаты. Мы надеемся, что другие представители индустрии поддержат эту инициативу и запустят дополнительные публичные логи. Это позволит добиться прозрачности в работе с национальными сертификатами.
Подробнее о проблеме
Итак, как вы можете знать, ряд российских сайтов уже столкнулись с отзывом выданных TLS-сертификатов. Напомню, что наличие действующего авторитетного сертификата жизненно важно для любого сайта, который работает с данными пользователей. Без сертификата невозможно удостовериться, что данные передаются именно тому сайту, который указан в адресной строке браузера, а не подделке злоумышленников. Как следствие, любой современный браузер не пускает пользователей на сайт, если его сертификат отозван (это нормальное, ожидаемое поведение).
Проблема в том, что российским сайтам всё сложнее получить такой сертификат. Удостоверяющие центры всё чаще отзывают ранее выданные сертификаты и отказывают в их выдаче. Да, сайты могут начать использовать самоподписанные сертификаты. Но к ним нет и не будет никакого доверия со стороны браузеров, из-за отсутствия контроля в их выдаче и применении. А значит, проблема с доступом к сайтам никуда не денется.
К чему это может привести? Вот несколько вариантов:
— Пользователям придётся передавать свои личные данные по протоколу http, то есть без шифрования, в явном виде (такие данные легко похитить на любом участке сети между сайтом и пользователем).
— Потребуется для каждого сайта как-то находить и устанавливать на компьютер их недоверенные корневые сертификаты, чтобы браузеры перестали «ругаться» на самоподписанные сертификаты. При этом ни у браузеров, ни у пользователей не будет никакого контроля за их применением. Например, несколько лет назад мы уже рассказывали о злоумышленниках, которые вмешиваются в трафик пользователей, тайно устанавливая корневые сертификаты на компьютер. Поэтому этот вариант крайне опасен.
— Теоретически браузеры могли бы прекратить проверять сертификаты. Но на практике никто на такое не пойдёт, потому что это равноценно переходу на http. Сертификаты без контроля не имеют смысла. Например, по этой причине мы сознательно вырезали из нашего браузера флаг --ignore-certificate-errors, который поддерживается в проекте Chromium. Потому что это опасно.
— Ещё есть вариант отказаться от использования интернета для всех сценариев, где есть риск перехвата данных.
Вряд ли можно назвать какой-либо из этих вариантов приемлемым.
Описание текущего решения
Есть альтернативная инициатива — создать национальные удостоверяющие центры (НУЦ) и поддержать их корневые сертификаты в браузерах. НУЦ смогут выдавать сертификаты тем сайтам (и только тем! ), которые к ним обратятся. Наличие альтернативы позволит не допустить ситуации, при которой пользователи лишатся доступа к онлайн-сервисам.
Первый такой НУЦ уже появился — на базе Госуслуг. Сейчас он работает следующим образом:
1. Юридическое лицо (владелец сайта) отправляет подписанную заявку на Госуслуги.
2. Госуслуги проверяют принадлежность домена.
3. В случае успеха помещают домен в публичный список, который доступен всем по адресу www.gosuslugi.ru/tls
4. НУЦ выписывает сертификат на сайт. Это обычный RSA с длинным ключом, ровно такой же, какой выписывают другие центры сертификации. Дальше ключи можно использовать как обычные TLS-сертификаты. То есть всё работает согласно общепринятой открытой криптографии и по известным правилам.
Конечно же, это решение не заработало бы без поддержки браузеров. Мы признали неполный авторитет сертификатов НУЦ в Яндекс Браузере в версиях для Windows и Android.
Неполный авторитет — это значит, что сертификаты НУЦ будут признаваться только для тех доменов, которые помещены в публичный список на gosuslugi.ru/tls. Если посещаемого сайта нет в этом списке, то попытка применить новый сертификат приведёт к стандартной ошибке и не даст посетить сайт. И нет, нельзя выпустить сертификат по маске так, чтобы покрыть все домены второго уровня (например, все *.ru) — на стороне Браузера такое просто не заработает. Кроме того, все входящие к нам изменения этого списка будут проходить через контроль явных ошибок. Если очень грубо, то это первый шаг к Certificate Transparency, чтобы обеспечить аудируемость процедуры выдачи сертификатов.
Наши планы
Текущее решение, конечно же, требует развития. Основной способ завоевания доверия к центру сертификации — это открытость. И здесь мы планируем несколько вещей.
Прежде всего, хотим организовать рассылку уведомлений в Яндекс Вебмастере тем владельцам сайтов, для которых зафиксирован выпуск сертификатов.
Наша более глобальная инициатива — поддержать стандарт Certificate Transparency (CT) и поднять публичный лог, в который НУЦ будет записывать выпущенные сертификаты. Если посещаемого пользователем сайта не будет в этом логе, то браузер выдаст ошибку ERR_CERTIFICATE_TRANSPARENCY_REQUIRED и не даст его открыть.
Мы хотим, чтобы наш Браузер проверял сертификаты не по одному, а по нескольким независимым друг от друга публичным логам, поэтому призываем других участников рынка присоединиться к инициативе и поднять дополнительные логи по стандарту CT.
Публичные логи позволят владельцам сайтов в любой момент времени проверить, выпускались ли сертификаты для их доменов. Более того, мы надеемся на появление внешнего аудита, который будет мониторить логи на предмет расхождений. Для удобства внешнего аудита мы хотим запустить аналог инструмента developers.facebook.com/tools/ct.
Большая просьба: если вы знаете, как сделать лучше, — приходите, советуйте. Хотите покритиковать решения — критикуйте и предлагайте улучшения.
P.S. Пока оформлял этот пост, прилетела новость: центр сертификации DigiCert, обслуживающий около 50 тыс. российских сайтов, ограничил им выдачу сертификатов.