LINUX.ORG.RU

Ограничиваем сертификат Минцифры

 , ,


25

7

Сейчас многие российские сайты, в первую очередь сайты банков, перешли (не по своей воле, но тем не менее) на использование УЦ, которые контролируются Правительством Российской Федерации. Корневые сертификаты этих УЦ (в просторечье - «сертификаты Минцифры»), как правило, по умолчанию не включаются в списки доверенных стандартными иностранными ОС и браузерами. Что будет, если мы их туда включим?

В теории, в этом случае Правительство РФ сможет устроить MITM-атаку: сделать какой-нибудь поддельный сайт, который выглядит как целевой иностранный, заверить его своим сертификатом, перенаправить все наши запросы на этот сайт, и мы ничего не заметим. С моей точки зрения, оно ни за что не станет таким заниматься. Разве что вы какой-нибудь террорист и против вас проводят целевую атаку, но в этом случае - уж извините. Но тем не менее, раз мы работаем в окружении нулевого доверия (то есть при заходе на сайт мы доверяем только себе и этому сайту, и никакие третьи стороны нам при этом не нужны), то с этим надо что-то делать.

Кстати, описанные ниже способы можно применять не только к сертификатам Минцифры, но и к любым другим. Что может быть актуально например для людей, против которых могут провести MITM-атаку иностранные товарищи майоры.

Отдельный профиль браузера

Chromium-подобные и Firefox-подобные браузеры позволяют создавать отдельный профиль, в который можно устанавливать свои сертификаты. Создаем такой профиль, устанавливаем туда сертификат Минцифры, и в дальнейшем используем его для посещения Госуслуг, сайтов банков и т.п. Это самый простой способ, однако к сожалению он подходит только для десктопных браузеров. На смартфонах, например, вряд ли применим.

Собственная цепочка доверия

Ради этого способа, собственно, и затевалась данная статья. Оригинальная идея подкинута в этом нейропосте @ZenitharChampion, за что ему спасибо.

Мы можем

  1. создать собственный доверенный корневой сертификат
  2. при помощи расширений X.509 указать, для каких сайтов он может применяться, и для каких не может
  3. подписать этим сертификатом открытый ключ Минцифры

В таком случае гипотетическая MITM-атака будет успешно остановлена: TLS-стек не найдет имя листового MITM-сертификата в списке доверенных в нашей части цепочки и откажется устанавливать соединение. При этом мы пользуемся стандартными механизмами X.509, не полагаясь на специфичные возможности браузера.

Данный прием называется кросс-сертификация, является стандартным и широко применяется в корпоративной среде.

Единственная потенциальная проблема - целевого сайта может не оказаться в предварительно построенном белом списке, так что потом его придется обновить.

Построение цепочки кросс-сертификации

Запросы без цепочки

Для начала, проверим как все работает из коробки.

$ curl https://vtb.ru                                
curl: (60) SSL certificate OpenSSL verify result: unable to get local issuer certificate (20)
$ curl https://sberbank.ru 
curl: (60) SSL certificate OpenSSL verify result: self-signed certificate in certificate chain (19)

vtb.ru и sberbank.ru пользуются сертификатом Минцифры. Добавляем этот сертификат в список доверенных:

$ curl --cacert ./ca/russian_trusted_root_ca_pem.crt https://vtb.ru
$ # успех
$ curl --cacert ./ca/russian_trusted_root_ca_pem.crt https://sberbank.ru
$ # успех

Задача данного примера - выпустить такой сертификат, чтобы curl успешно подключался только к vtb.ru, но не к sberbank.ru.

Выпуск сертификатов

Не то чтобы использовать Easy-RSA тут обязательно, но раз он позволяет упростить скрипты, то почему нет. Этот проект развивается разработчиками OpenVPN. Доступен во всех дистрибутивах, представляет собой bash-скрипт, который дергает openssl с нужными опциями. Рекомендую. Выпускаем корневой сертификат:

$ export EASYRSA_PKI="./pki"
$ easyrsa init-pki
$ easyrsa build-ca nopass
$ ls pki/ca.crt   
pki/ca.crt

Добавлять расширения прямо в корневой сертификат крайне не рекомендуется (и не поддерживается в некоторых TLS-стеках). Доверенный корневой сертификат должен быть минимально возможным и как можно более редко изменяемым. Поэтому выпускаем промежуточный сертификат и добавляем нужные расширения уже в него.

Далее следует основная магия. Сертификаты с помощью openssl можно выпускать, как используя Certificate Request (*.csr), так и какой-то уже существующий сертификат в качестве шаблона, даже не зная его секретный ключ. При этом соответствующий новому сертификату открытый ключ будет совпадать с оригинальным, также как и прочие значащие поля (Subject и т.п.). А значит, если мы используем сертификат Минцифры в качестве шаблона, то TLS-стек успешно проверит подпись и сможет построить цепочку доверия. Для начала нужно подготовить файл с описанием расширений X.509. В качестве примера воспользуемся тем, что идет в комплекте с easy-rsa:

$ cat /usr/share/easy-rsa/x509-types/ca
basicConstraints = CA:TRUE
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer:always
keyUsage = cRLSign, keyCertSign

Копируем этот файл куда-нибудь и вносим изменения:

basicConstraints = CA:TRUE, pathlen:1
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer:always
keyUsage = cRLSign, keyCertSign
nameConstraints = critical, permitted;DNS:vtb.ru

pathlen:1 задает максимальную длину цепочки до листового сертификата, а ключевым является nameConstraints - именно это расширение задает список допустимых имен. critical не дает построить цепочку доверия в случае, если в используемом движке TLS нет поддержки этого расширения. easy-rsa к сожалению работает только с CSR, поэтому генерируем подставной сертификат вручную:

$ openssl x509 -in ./ca/russian_trusted_root_ca_pem.crt \
  -CA pki/ca.crt \
  -CAkey pki/private/ca.key \
  -extfile ca.cnf \
  -out pki/issued/cross.crt

Проверка

Готовим тестовое хранилище сертификатов:

$ cp ./pki/ca.crt ./pki/issued/cross.crt ./mycerts/
$ openssl rehash ./mycerts

Тестируем:

$ curl --capath ./mycerts https://vtb.ru
$ # входит и выходит
$ curl --capath ./mycerts https://sberbank.ru
curl: (60) SSL certificate OpenSSL verify result: permitted subtree violation (47)

Обратите внимание на ошибку, с которой завершилась проверка. Она возникла именно из-за того, что sberbank.ru нет в списке в nameConstraints в сгенерированном подставном сертификате.

Установка в браузер

Открываем chrome://certificate-manager/localcerts/usercerts В «Trusted Certificates» добавляем ca.crt, в «Intermediate Certificates» - cross.crt. Проверяем, работает. Из-за ограниченной природы этих сертификатов их можно добавить прямо в основной профиль браузера.

Установка в Android

Копируем сертификаты на смартфон, находим настройку «установить сертификаты с карты памяти», выбираем «сертификаты центра сертификации». Добавляем ca.crt и cross.crt, проверяем - работает.

Установка в Linux

Различается в зависимости от дистрибутива, например в Arch Linux сертификатами заведует пакет p11-kit и входящая в него утилита trust.

Благодарности

★★★★★

Проверено: hobbit ()
Последнее исправление: CrX (всего исправлений: 3)
Ответ на: комментарий от zx_gamer

Куда подключиться по SSH? К сайту госуслуг или ВТБ??

AlexM ★★★★★
()

В теории, в этом случае Правительство РФ сможет устроить MITM-атаку

В теории, любой УЦ так может сделать. Что, забаним https, ммм?

dobro
()
Ответ на: комментарий от Wapieth

ну два банка, что использую, обходятся без подобной ереси. Если одному банк-клиенту нужно много доменов - явно что-то не так в консерватории.

lomaster
()
Ответ на: комментарий от Aceler

Подписать можно секретным ключом. парным к открытому. Открытым можно только проверить подпись. Сертификаты для проверки подписи нужны.

gns ★★★★★
()
Ответ на: комментарий от gns

Видать ты путаешь секретные и открытые ключи.

Видать ты не в курсе, что именно содержится в сертификате и что такое CA и PKI

router ★★★★★
()
Ответ на: комментарий от router

А ты путаешь подписанный открытый ключ с секретым. Читай Шнаера для начала и разберись в терминологии.

gns ★★★★★
()
Ответ на: комментарий от gns

А ты путаешь подписанный открытый ключ с секретым.

Нет, я не путаю. А ты, видимо, из секты свидетелей защиты информации. Прочитать шнайдера и запомнить только отрывки

router ★★★★★
()
Ответ на: комментарий от gns

Тогда не лезь в ту область, в которой не разбираешься. x509 сертификаты это не только и не столько криптография, сколько CA и PKI

router ★★★★★
()
Ответ на: комментарий от router

Вот ты сам нахватался слов, значения которых плохо понимаешь. Сертификат он что сертифицирует?

gns ★★★★★
()
Ответ на: комментарий от gns

Еще раз, ты путаешь x509 со своим примитивным pgp

Здесь дело не ограничивается двумя числами и функцией над ними

Если ты закрытым ключом подпишеь открытый, это не будет x509 сертфикатом. Сертификат подписывается сертфикатом. И подпись в нем - только одна часть. Важная. Но только одна

router ★★★★★
()
Ответ на: комментарий от router

Еще раз. Сертификат не подписывается сертификатом. Сертификат — это и есть подпись открытого ключа вместе с реквизитами подписывающего и хозяина открытого ключа.

gns ★★★★★
()
Ответ на: комментарий от gns

это и есть подпись открытого ключа вместе с реквизитами

Два с минусом. Сертификат - это структура данных. Содержит информацию о том, кто выписал сертификат, кому, для каких целей, как проверить, где искать crl, серийный номер, san, ограничения области действия. И среди прочих - открытый ключ

В который раз повторяю, ты перепутал сертификат с открытым ключом и выглядишь глупо

router ★★★★★
()
Ответ на: комментарий от router

Содержит информацию о том, кто выписал сертификат, кому, для каких целей, как проверить, где искать crl, серийный номер, san

Это и есть реквизиты

gns ★★★★★
()
Ответ на: комментарий от gns

И без них твоя пара открытого и закрытого ключа полностью бесполезны

router ★★★★★
()

Зачем такие сложности, если можно ходить в спербанк через яндекс-браузер с мамкиного компа. Лучше бы избегать конечно таких злачных мест, но если уж так хочется косить под быдло, то нужно мимикрировать: шинда, яндыкс, вот это всё. А так сам набор софта выдаёт антисистемного кулхацхера с головой.

bread
()
Ответ на: комментарий от gns

Ну хорошо, но в простонародье говорят «подписать сертификатом», имея в виду подпись закрытым ключом, соответствующим открытому ключу сертификата.

Окей, будем придерживаться технически правильной терминологии.

Aceler ★★★★★
()
Ответ на: комментарий от gns

Ты подписываешь чужой открытый ключ своим секретным ключом. Вот свой секретный и надо оборонять, потому что ты его добавляешь в доверенные корневые УЦ.

Khnazile ★★★★★
()
Последнее исправление: Khnazile (всего исправлений: 2)
Ответ на: комментарий от Khnazile

Ну так и я про то же. Сертификат-то чо оборонять? Его хоть на заборе писать можно

gns ★★★★★
()
Ответ на: комментарий от Aceler

Ну вот путаница в терминологии меня и зацепила.

gns ★★★★★
()
Ответ на: комментарий от ZenitharChampion

Как только какой-то неограниченный корневой сертификат появился у тебя в доверенных, через него становится можно осуществлять MitM. Если алгоритм для которого сгенерированы ключи сертификата поддерживается твоим браузером и сертификату установлено полное доверие - все, этого достаточно.

no-dashi-v2 ★★★★
()
Ответ на: комментарий от Stanson

а переписывать браузеры - нереально.

Почему? Исходники же открыты. Добавляемая логика не выглядит сложной.

monk ★★★★★
()
Ответ на: комментарий от monk

Почему? Исходники же открыты. Добавляемая логика не выглядит сложной.

Найди сначала в этих исходниках всё что нужно переделать, а потом делай это каждый раз когда выходит новая версия.

Грубо говоря - ты исходишь из того, что сырцы браузера похожи на сырцы нормального софта, и что где-нибудь в сырцах просто есть компактный файлик certificate_check.cpp, в котором целиком и полностью содержится весь код который относится к проверке сертифиактов, но это не так. На самом деле там 100500 абстракций над абстракциями ради абстракций в сотнях разных файлов и по ним размазана вся эта логика так, что концов не найдёшь. Валидность проверяется в одной абстракции, домен для проверки извлекается в трёх абстракциях дальше в совершенно другом месте, специальная гуйня сообщений об ошибках вообще в третьем, всё это соединено через кучу прослоек, имеет кучу непонятных пропертей и методов, документация на это всё полностью отсутствует и т.п.

Если бы исходный код браузеров было так просто переделывать, то никто бы не пользовался ни фаерфоксом, ни хромиумом, все давно сидели бы на обезжиренных форках без блоатвари, идиотских «сервисов», без ограничений по вырезанию рекламы и т.п. Однако, даже самый популярный и поддерживаемый(?) ungoogled-chromium представляет собой жалкое зрелище, в котором даже работоспособность всех фич uBO не могут восстановить и даже от половины блоатвари так и не избавились. Исходный код при этом, разумеется, юзабельнее не стал.

Stanson ★★★★★
()
Ответ на: комментарий от Stanson

Если бы исходный код браузеров было так просто переделывать, то никто бы не пользовался ни фаерфоксом, ни хромиумом, все давно сидели бы на обезжиренных форках без блоатвари, идиотских «сервисов», без ограничений по вырезанию рекламы и т.п.

наивное летнее дитя)) Вон я в своей предыдущей статье написал про Brave Origin - форк хромиума со встроенной баннерорезкой, вертикальными вкладками, возможностью поднять свой сервер для синхронизации профиля и т.п. Наспамили «ненужно». Ну окей, я пользуюсь. Прекрасно работает, когда гугл в рамках резания костов отключит синхронизацию профилей для хромиума - начнется массовое бурление, а я ничего не замечу.

Lrrr ★★★★★
() автор топика
Последнее исправление: Lrrr (всего исправлений: 1)
Ответ на: комментарий от router

Сертификат подписывается сертфикатом.

Ну вот возьми сертификат лора и подпиши им сертификат минцифры. Напиши, как получится )

Aceler ★★★★★
()
Ответ на: комментарий от no-dashi-v2

Алгоритм-то может и поддерживается, вот только в Яндекс.Браузере (и возможно в Chromium-gost) его можно отключить одной настройкой, и включать по мере необходимости. Но лучше, конечно, отдельный профиль браузера.
// ого, кто вернулся. последний раз видел тебя тут в 2010-м.

ZenitharChampion ★★★★★
()
Последнее исправление: ZenitharChampion (всего исправлений: 1)
Ответ на: комментарий от Lrrr

Brave - такое же говно как и хром, просто сливает данные не только гуглю, но и тем кто замутил Brave. Только и всего. В таком форке крыжик «запретить serviceworkers» не появится.

Brave - действительно ненужно. И даже вредно.

Stanson ★★★★★
()
Ответ на: комментарий от monk

Вот именно ради этого браузеры и превратили в опенсурсную блоатварь. Сродни обфускации, но порядки мерзее.

Смачный такой харчок в лицо всем кто полагал что корпорации пишущие опенсурс это замечательно.

Ещё характерный пример такого «опенсурса» - «открытые» дрова невидии, которые на 90% состоят из сишных массивов сделанных из проприетарных бинарных блобов.

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

Простейший пример - гугловский невменяемый ублюдок v8 против фабрисовского QuickJS. Ясен пень я по своей воле исключительно QuickJS буду использовать а вовсе не гугловское убожище.

Stanson ★★★★★
()

А случайно ни по этой ли причине у меня перестал грузиться магазин расширений в firefox (с впном в магазин захожу, без него ни в какую) ?

Black1980
()
Ответ на: комментарий от Stanson

Если бы исходный код браузеров было так просто переделывать, то никто бы не пользовался ни фаерфоксом, ни хромиумом

Чушь...

Somebody ★★★★
()
Последнее исправление: Somebody (всего исправлений: 1)
Ответ на: комментарий от Black1980

Скорей магазин расширений файрфокса сидит за клаудфларом, а тот, в свою очередь, весьма сильно страдает от ТСПУ роскомнадзора

no-dashi-v2 ★★★★
()

А вы что, не доверяете госструктурам и банкам своей родной страны(?), раз пытаетесь ограничить действие сертификатов Минцифры? Тогда просто не добавлять их в браузер и не лазать по госсайтам — не вариант? Вы уж определитесь: крестик снять или трусы надеть.

iZEN ★★★★★
()
Ответ на: комментарий от iZEN

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

Доверяй но проверяй. Не учили?

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

В идеале вообще свой открытый SSH ключ в банк лично относить, и по SSH подключаться, а там TUI интерфейс с цифрами и таблицами, а не тикток рилсы прости господи. =) Дело не в недоверии ради недоверия, а всяком предостережении от 0-day когда внезапно окажется что есть дырень и сайт с котиками на соседней вкладке какой-то магией получает доступ к соседней вкладке с документами на землю или ещё чего.

LINUX-ORG-RU ★★★★★
()
Последнее исправление: LINUX-ORG-RU (всего исправлений: 2)
Ответ на: комментарий от LINUX-ORG-RU

В идеале вообще свой открытый SSH ключ в банк лично относить, и по SSH подключаться

Зачем? Это происходит автоматически при соединении клиентского браузера с сайтом банка по https — происходит обмен публичными ключами, чтобы сформировать последовательность цифр (сеансовый ключ) для шифрования трафика. Сертификат банка нужен для подтверждения, что сайт банка, с которым установлено соединение, является доверенным и входит в цепочку доверяемых сертификатов от Минцифры. Публичные ключи организаций находятся в соответствующих сертификатах этой цепочки, их нужно предоставить для работы протоколов шифрования для установления защищённого https-соединения «точка-точка» между браузером и сайтом банка. Никто устраивать мифическую атаку «человек-посередине» (MitM, Man-in-the-Middle) не собирается, если цели ни одной из сторон не ясны.

iZEN ★★★★★
()
Ответ на: комментарий от iZEN

Ответственное лицо юридическое и относится только к банку, а акционером банка могу быть и я сам. Даже если у меня 1 акция за 250 рублей =) У меня нету правда :3, но ничто не мешает одну штучку взять и всё, вуаля я акционер, тока права качать не смогу :(. Я понимаю твой посыл сейчас и cогласен, но в целом, как выше сказал, сама идея жёстких ограничений при работе с госсайтами с банками и прочими вещами где твои документы, хороша. Если не на уровне сертификата даже, то хоть на уровне отдельных настроек профиля браузера, чтобы в другие места вообще не мог ходить. И не в MITM дело, я если что вообще не про него и не про это всё.

Мне лично не понравилось твоё категоричное, либо доверяй и пользуйся, либо не доверяй и не пользуйся. Ну блин, это как на своём автомобиле кататься, к автомобилю доверия нет и быть не может, в любой момент что-то может пойти не так, поэтому есть обязательный тех осмотр 100500 датчиков только и ждущих что ща всё развалится и так далее. Но ехать надо, и ехаем. Так и тут

LINUX-ORG-RU ★★★★★
()
Ответ на: комментарий от LINUX-ORG-RU

В идеале вообще свой открытый SSH ключ в банк лично относить, и по SSH подключаться

Просто сходить в банк уже нельзя? Без вот этого хипсторства с приложениями и прочим бредом.

bread
()
Ответ на: комментарий от iZEN

То был прикол, хотя было бы прикольно на деле. А так я не про MitM вообще. Я про общее ограничение и изоляцию внешнего доступа к реально критическим для граждан ресурсам. Тут скорее к дырам браузеров доверия нет, а дыры где-то есть, прост пока про них не знаем. Фиг с ними с MitMами, чё там узнают какое я аниме смотрел, ну Тоторо я смотрел. А суть в том чтобы этот Тоторо вообще не открывался там где открываются важные ресурсы и точка, всё остальное следствие, или можно сказать отсечка всего, включая и митмы, и всякие межсайтовые махинации ресурсов через куки, localhost порты и так далее. Нечего даже думать доверяешь ты чему-то из этого или нет, просто всё обрубаешь и всё! И работает ровно то что нужно, сайт с документами и сайт со счетами, а больше ничего и не должно. В рамках изолированной сессии или профиля браузера, как на уровне запуска так и на уровне подключения лишним не будет. Просто отрубаешь весь несвязанный с сутью мусор и всё.

LINUX-ORG-RU ★★★★★
()
Последнее исправление: LINUX-ORG-RU (всего исправлений: 1)
Ответ на: комментарий от Dimez

Ну на фастли тоже много чего не открывается, так что я его скопом закинул в впн. Но ключевое что проблема не сертификатов с ним

no-dashi-v2 ★★★★
()

pathlen:1

как будет работать без этого параметра? В чем отличие в поведении?

Jaberwock ★★★
()
Ответ на: комментарий от no-dashi-v2

фастли не на ТСПУ блочится, а по ip. Но у меня заработал магазин расширений, хотя после аварии правда был в блоке по ip

peregrine ★★★★★
()

Не всем нужно ограничивать сертификат Минцифры.

saahriktu ★★★★★
()
Ответ на: комментарий от no-dashi-v2

В любом случае я видел своими глазами IP где был магазин в публичном реестре РКН, ТСПУ обычно в публичный реестр записи не добавляет.

peregrine ★★★★★
()
Ответ на: комментарий от peregrine

Там порядок обратный. Ресурс вносится в реестр и после этого его начинают блокировать средствами ТСПУ или провайдера.

no-dashi-v2 ★★★★
()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.