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


18

У меня дома настроен 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 = *просто не разрешено? Как я могу достичь того, чего хочу?


Примечание: для крупных веб-сайтов ваш браузер, вероятно, не примет какой-либо сертификат, который вам удастся создать. Эти сайты используют закрепление сертификатов и отправляют отпечатки своих сертификатов TLS для включения в эти браузеры. Ваш сертификат не будет соответствовать сохраненному отпечатку пальца и будет заблокирован. Вот больше информации: noncombatant.org/2015/05/01/about-http-public-key-pinning
Мартейн Химельс

Самостоятельно подписанные сертификаты могут быть проблематичными, как вы обнаружили. Вместо этого вы можете посмотреть на получение «правильной» сертификации от letsencrypt.org - они бесплатны и поддерживают шаблоны. В зависимости от того, сколько хостов вы пытаетесь покрыть тем, что вам действительно нужно, один (или более) сертификатов от letsencrypt может покрыть вас
Дейв Смайл

2
@DaveSmylie это для рекламодателя, я не владею доменами.
Даниэль ван ден Берг

1
@ Stewart, пожалуйста, прочитайте мой предыдущий комментарий.
Даниэль ван ден Берг

1
Также обратите внимание: если вы используете это для блокировщика рекламы, может быть лучше просто молча отбросить соединения с соответствующими серверами, а не показывать альтернативную страницу. 90% современных рекламных объявлений изначально загружаются с помощью JavaScript, поэтому вряд ли ваша альтернативная страница будет иметь реальную видимость на странице. На самом деле, вероятно, что-то сломается, пытаясь загрузить не-JavaScript ресурсы как Javascript.
Nzall

Ответы:


42

Это не разрешено. В качестве специфичного для протокола дополнения к стандартной проверке имени хоста 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
Руи Ф. Рибейро

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

25
Проголосовал за стратегическое размещение «и других вредоносных программ».
Джурис

@ DaniëlvandenBerg: я случайно предложил один в самом посте. Я только что добавил ссылки на примеры Nginx и Squid.
user1686

5

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.