Самоподписанный сертификат подстановочного знака

2923
Daniël van den Berg

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

Я пытаюсь сделать это, создав самозаверяющий сертификат для любого URL и установив его на свое устройство. Команды, которые я использовал для генерации сертификата:

openssl genrsa 2048 > pihole.key openssl req -new -x509 -nodes -days 36500\ -key pihole.key \ -subj "/C=NL/ST=Utrecht, Inc./CN=*" \ -reqexts SAN \ -config <(cat /etc/ssl/openssl.cnf \ <(printf "\n[SAN]\nsubjectAltName=DNS:*,DNS:*")) \ -out pihole.cert openssl x509 -noout -fingerprint -text < pihole.cert > pihole.info cat pihole.cert pihole.info > pihole.pem service apache2 reload 

Я установил этот сертификат на моем устройстве Windows, и Windows показывает, что это действительный сертификат.

Тем не менее, хром дает мне NET::ERR_CERT_COMMON_NAME_INVALID, а край дает мне похожую ошибку ( DLG_FLAGS_SEC_CERT_CN_INVALID)

Почему это? Это CN = *просто не разрешено? Как я могу достичь того, чего хочу?

13
Примечание: для крупных веб-сайтов ваш браузер, вероятно, не примет какой-либо сертификат, который вам удастся сгенерировать. Эти сайты используют закрепление сертификатов и отправляют отпечатки своих сертификатов TLS для включения в эти браузеры. Ваш сертификат не будет соответствовать сохраненному отпечатку пальца и будет заблокирован. Вот дополнительная информация: https://noncombatant.org/2015/05/01/about-http-public-key-pinning/ Martijn Heemels 6 лет назад 0
Самостоятельно подписанные сертификаты могут быть проблематичными, как вы обнаружили. Вместо этого вы можете посмотреть на получение «правильной» сертификации от letsencrypt.org - они бесплатны и поддерживают шаблоны. В зависимости от того, сколько хостов вы пытаетесь покрыть тем, что вам действительно нужно, один (или более) сертификатов от letsencrypt может покрыть вас Dave Smylie 6 лет назад 0
@DaveSmylie это для рекламодателя, я не владею доменами. Daniël van den Berg 6 лет назад 1
https://letsencrypt.org/ предоставит вам подписанные сертификаты бесплатно Stewart 6 лет назад 0
@ Stewart, пожалуйста, прочитайте мой предыдущий комментарий. Daniël van den Berg 6 лет назад 0
Также обратите внимание: если вы используете это для блокировщика рекламы, может быть лучше просто молча отбросить соединения с соответствующими серверами, а не показывать альтернативную страницу. 90% современных рекламных объявлений изначально загружаются с помощью JavaScript, поэтому вряд ли ваша альтернативная страница будет иметь какую-либо реальную видимость на странице. На самом деле, вероятно, что-то пойдет не так, пытаясь загрузить не-JavaScript ресурсы как Javascript. Nzall 6 лет назад 1

2 ответа на вопрос

34
grawity

Это не разрешено. В качестве специфичного для протокола дополнения к стандартной проверке имени хоста TLS все основные веб-браузеры (клиенты HTTPS) в основном согласились ограничить использование групповых сертификатов «eTLD + 1», то есть должен существовать «эффективный TLD» плюс еще один Компонент

Как правило, это означает, что требуется по крайней мере два компонента ( *.example.netэто нормально, но *.netэто не так, и не является пустым *). Правило «эффективного ДВУ» расширяет его до многоуровневых суффиксов, поскольку co.ukлюди на практике используют их как неделимые «ДВУ». (Так *.example.ac.ukразрешено, но *.ac.ukнет.)

Вы можете проверить, как реализован общедоступный список суффиксов в Chromium и Mozilla .

См. Соответствующее обсуждение в Security.SE, в котором есть цитата из базовых требований форума CA-Browser (которые применяются только к общедоступным CA WebPKI, но все равно отражают общую реализацию):

ЦС ДОЛЖНЫ аннулировать любой сертификат, в котором подстановочный знак находится в первой позиции метки непосредственно слева от метки, «контролируемой реестром» или «открытого суффикса».


Чтобы избежать этого ограничения, создайте центр сертификации, который выдает сертификаты «по требованию» для любого веб-сайта, который вы пытаетесь посетить. Я не знаю, как это будет реализовано на любом обычном веб-сервере, но это распространенный метод, используемый в коммерческих системах перехвата TLS; антивирусные программы и другие вредоносные программы; и инструменты разработки, такие как пакет Burp Proxy.

Например, веб-сервер OpenResty (в основном Nginx-with-Lua) имеет ssl_certificate_by_luaвозможность реализовать динамическую генерацию сертификатов. Прокси-сервер Squid поддерживает имитацию сертификатов в своей функции ssl-bump.

Также обратите внимание, что SAN полностью перекрывают Subject-CN, если присутствуют оба. Это делает включение CN в основном избыточным (если ваше клиентское программное обеспечение не является настолько древним, что в нем отсутствует поддержка SAN), а для общедоступных CA веб-браузеры даже не принимают его больше.

Я уже нашел об этом пределе TLD + 1 эмпирически здесь в проекте ранее. Спасибо, что выложили это. +1 Rui F Ribeiro 6 лет назад 0
Спасибо за ваш сложный ответ, я думаю, это объясняет это, да. Вы знаете другой подход, который я мог бы использовать? Daniël van den Berg 6 лет назад 0
Проголосовал за стратегическое размещение «и других вредоносных программ». Džuris 6 лет назад 20
@ DaniëlvandenBerg: Я случайно предложил один в самом посте. Я только что добавил ссылки на примеры Nginx и Squid. grawity 6 лет назад 0
3
Steffen Ullrich

В сертификате может быть только один подстановочный знак (т. Е. Нет *.*.example.com), он может соответствовать только одной метке (т. Е. Только wwwнет www.example.com), он может находиться только в самой левой позиции (т. Е. *.www.example.comНо не www.*.example.com), и он не может быть внутри общедоступного суффикса. (т.е. нет *.com).

Похожие вопросы