Pull to refresh
13
14.1
Send message

Как известно, основной глобальный инструмент для просмотра логов Certificate Transparency (CT-логов) через веб-интерфейс - это crt.sh. Однако сертификаты российских УЦ в глобальные логи пока не попадают (перечень принимаемых сертификатов и пресертификатов в CT-логе всегда ограничен некоторым набором корневых ключей). Для российских УЦ запущены российские CT-логи. Для просмотра российских CT-логов тоже есть сервисы с веб-интерфейсом:

  • ct.tlscc.ru - это выделенный экземпляр crt.sh, поддерживаемый ТЦИ и настроенный на российские логи; веб-сайт использует TLS-сертификат, выпущенный от корня ТЦИ, так что если корня в браузере нет, то будет выдаваться предупреждение; (пример запроса);

  • precert.ru - отдельный и весьма удобный сервис, имеющий целый ряд преимуществ: например, здесь другой интерфейс для поиска записей, подробная статистика по логам и УЦ; (пример запроса).

Сейчас в российские CT-логи добавляются сведения о сертификатах, выпускаемых НУЦ (все логи) и ТЦИ (логи "Яндекса" и VK). Основной объём логов составляют пресертификаты, которые добавляют сами УЦ, в процессе выпуска сертификата. Пресертификат отличается от сертификата наличием специального расширения (CT Poison), отсутствием SCT-меток и значением подписи. Обратите внимание, что сертификаты добавить в CT-лог может каждый. Например, можно добавить сертификат, найденный на каком-то веб-узле в Сети (если, конечно, сертификат выпущен подходящим УЦ). Но для добавления придётся уже воспользоваться HTTP-интерфейсом соответствующего лога напрямую, подготовив и отправив POST-запрос.

Зачем просматривать CT-логи? Во-первых, наличие сторон, изучающих записи в CT-логах, это основной декларируемый смысл Certificate Transparency. Во-вторых, просмотр логов позволяет пронаблюдать, что и для чего выпускается, и даже минимально контролировать выпуск сертификатов для тех доменов, которые вы администрируете; Certificate Transparency не гарантирует, что сведения о выпущенном сертификате будут в CT-логе, но такие сведения могут там быть, а сам по себе сертификат, благодаря наличию цифровой подписи, это какой-никакой, но документ, подтверждающий хотя бы свой собственный выпуск. В-третьих, в логах можно найти что-то неожиданное - для этого внимание нужно обращать на таймстемпы, на формат (пре)сертификатов, на состояние конкретных лог-сервисов.

Tags:
0
Comments0

В связи с интенсивным сокращением максимального срока действия TLS-сертификатов (пока что обещают 47 дней, но для всех и к 2030 году), коллеги саркастически поинтересовались, можно ли сделать так, чтобы сертификат выписывался на каждый TLS-запрос. Шутки - шутками, но сделать-то можно. И даже не требуется переделывать протокол TLS - есть готовое решение.

Если внимательно посмотреть на алгоритм TLS-хендшейка, то окажется, что секретный ключ, соответствующий открытому ключу из серверного сертификата, требуется там только один раз - для формирования подписи в сообщении CertificateVerify. Соответственно, секретного ключа от сертификата вообще может не быть на сервере, а сервер будет обращаться к некоторому подписывающему узлу, у которого этот ключ есть и который подтвердит TLS-сессию, подписав значение для CertificateVerify. Это вовсе не теоретическое рассуждение, именно так делается на практике, когда входящие соединения принимает прокси-провайдер (CDN, обычно), но передавать этому провайдеру секретные ключи от сертификатов для своих доменов клиент не желает. Первыми в промышленных масштабах такую услугу сделали в Cloudflare, более десяти лет назад. Называется Keyless SSL.

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

Сертификат, таким образом, окончательно превратится в безотзывный тикет доступа, мгновенного действия, а сервер будет привязан к центральному провайдеру (можно совместить с крупными CDN, у которых и так есть собственные хорошо известные УЦ). Проверку совпадения подписей, серверной и на сертификате, будет всё так же проводить браузер (речь, напомню, про веб). В браузере ничего не нужно переделывать совсем: если сервер не смог предъявить корректную подпись в CertificateVerify - TLS-сессия браузером установлена не будет.

Это, если что, была минутка технологического юмора. Но вот то, что развитие инфраструктуры TLS-сертификатов в вебе движется в сторону тикетов доступа (или, скорее, квитанций) - отрицать всё сложнее.

Tags:
+6
Comments5

Пишут, что CA/B-форум согласовал дальнейшее сокращение интервала валидности TLS-сертификатов: теперь планируют к 2029 году уменьшить этот интервал до 47 дней. Ожидаемо. Я бы предположил, что ещё короче сделают (да и, фактически, раньше; например, Let's Encrypt уже готовит шестидневные сертификаты).

Тенденция коснётся и сертификатов, выпускаемых "собственными УЦ": если браузер принципиально не верит сертификатам только на основании длительности их интервала валидности, то не играет роли, был ли добавлен корневой ключ УЦ вручную или приехал в составе дистрибутива. (Технически, да, урезать действие ограничения для "домашних" сертификатов можно, но вряд ли имеет смысл на это рассчитывать.) Кроме того, строго автоматический выпуск сертификатов - требует наличия подходящего API на стороне УЦ, тоже немаловажный технологический фактор.

Интересно, что TLS-сертификаты становятся больше похожи на квитанции доступа. Что-то вроде тикетов в каком-нибудь глобальном Kerberos, только повёрнуто в сторону к клиенту, который с браузером. При этом всякий веб-узел должен постоянно и автоматически отмечаться на центральном сервисе, получая новую квитанцию, которая разрешает браузерам доступ. Ну или квитанцию сервис не выдаёт, тогда доступ к веб-узлу для браузеров отключается автоматом. Да, нужно будет ещё в браузерах отключить возможность "отменить предупреждения безопасности" простым способом, но это уже детали.

Tags:
Total votes 4: ↑4 and ↓0+6
Comments0

Если вероятность события ноль, то это "невозможное" событие, которое никогда не произойдёт. А событие с вероятностью единица (100%) - напротив, случается всегда. Так ли это? Популярная тема из области прикладной теории вероятностей. Например, вот довольно старый ролик на канале Бориса Трушина, где утверждается, что нет, всё не так, и считать, что событие с вероятностью 100% обязательно происходит, а с нулевой вероятностью - не происходит, "это распространённое заблуждение". Пример тоже привычный: пусть вероятность попасть в конкретную точку окружности (над ℝ), выбирая точки случайно, равна нулю, однако такое событие всё равно произойдёт, потому что в какую-то точку попасть всегда можно.

Нулю вероятность должна быть равна из-за того, что точек на окружности, так сказать, слишком много, даже больше, чем натуральных чисел, и все точки равноправны: если бы одной точке назначить сколь угодно малую вероятность, отличную от нуля, то суммарная вероятность по всем точкам получится бесконечно большой, а хотелось бы, исходя из свойств выбранного вероятностного пространства, чтобы была единица ("вероятность не бывает больше 100%"). Естественно, в нужный момент происходит предельный переход и оказывается, что вероятность нуль - это означает, что должно стремиться к нулю отношение исходов экспериментов. Занятно, что в бесконечном случае, на минуточку, событие с нулевой вероятностью как бы может произойти любое конечное количество раз, и при этом его вероятность не перестанет быть нулевой. Интересно.

Это всё верно, но запутывает достаточно сильно, чтобы спрашивать на собеседованиях (непонятно только на какую должность).

Вообще, если ввести привычные координаты, то точка, которую случайно выбрали, "обязательно" будет иррациональной. Из тех же соображений, по которым вероятность попасть в эту точку равна нулю (см. выше): понятно, что иррациональных точек на окружности сильно больше, чем рациональных. Однако даже координаты одной иррациональной точки не выйдет записать точно в виде десятичной дроби (по определению), что уж там говорить про формирование бесконечного набора таких точек, чтобы признать их событиями и начать выбирать случайно. Попытки выбирать элементы бесконечных множеств давно приводят к разночтениям в основаниях математики, но это мало кого волнует. Вот выбрать некоторую аксиоматику, принять арифметику с действительными числами - это можно. Однако существенная часть теории вероятностей - про прикладные измерения, а действительные числа таким измерениям не поддаются (по определению). Вот отсюда и кажущаяся контринтуитивность: просто, пространство было выбрано максимально далёкое от физических измерений.

С другой стороны, если нашу окружность аккуратно нарезать на конечное количество непересекающихся интервалов по рациональным точкам (попробуйте) и, приняв топологический подход, потребовать попадания в интервал около точки, а не в точку, то события, имеющие нулевую вероятность, происходить перестанут, а те, которые "с вероятностью 100%", напротив - начнут происходить всегда.

Можно развить вычислительный подход. Предположим, что мы строим случайным образом из центра окружности луч, который пересекает окружность в какой-то точке. Но формировать луч и подсчитывать точки требуется при помощи программы на языке Python (например), выводя уравнение луча и координаты попадания. С одной стороны, попадание в иррациональную точку станет строго невозможным (нулевая вероятность, почти так же, как и в исходном примере), с другой стороны - луч должен нередко проходить "сквозь" окружность без пересечения, так как мы, с точки зрения алгебры, потребовали, чтобы решения для системы уравнений луча и окружности всегда были рациональными (даже целыми, на самом деле), а над рациональными числами луч и окружность могут не пересекаться. И какова тогда вероятность того, что подобная программа на Python завершится, успешно обнаружив луч, который не пересекает окружность? Должна бы быть единица.

Tags:
Rating0
Comments2

Представим, что у нас некоторая система, состоящая из микросервисов, которые работают на разных машинах, но внутри общей IP-сети на немаршрутизируемых IP-адресах (10.0.0.0/8, 192.168.0.0/16 и т.д.). Микросервисы разговаривают друг с другом по TCP, подключаясь по IP-адресам, указанным в соответствующих конфигурационных файлах каждого. Но можно указать и не IP-адрес, а некий хостнейм, прописав его же в /etc/hosts. Почему-то часто считают, что "хостнейм эквивалентен IP-адресу". Оно, конечно, удобно так считать, с точки зрения "человекопонятности", но не всегда хорошо с точки зрения безопасной настройки.

Дело в том, что опечатка (или намеренная замена символа) в имени хоста может привести к тому, что адрес окажется в чужой DNS-зоне. Простейший случай: users-db.example.com -> users-db.example.co. Да, должно быть закрыто, да, есть .local, а хостнеймы можно записывать одним "лейблом", но это не решает проблему: использование символьного хостнейма гарантирует дополнительные запросы для разрешения имён, будь то локальные запросы на той же машине или запросы внешние, возникшие из-за опечатки. А всякий, даже локальный, библиотечный/системный вызов, выполняющий трансляцию имён и адресов, готов принести с собой неожиданные эффекты (см. ниже пример уже про IP-адреса). Не обязательно это эффекты от подмены библиотеки или подмены конкретного вызова. А если кто-то умеет записывать в /etc/hosts, то он и конфиг любой поправит. Что, впрочем, не всегда так, поскольку раскладывание hosts по машинам могут автоматизировать - тогда перехватить нужно только точку управления скриптом, формирующим файл. А ведь ещё обычно используется два протокола: v6 и v4, адреса и "резолвинг" там разные.

Если в конфигах микросервисов прописывать непосредственно IP-адреса (пусть и автоматом), то ситуация несколько лучше. Есть неплохие шансы, что трансляция имён/адресов не будет использована. Минимальная опечатка в записи немаршрутизируемого адреса реже приводит к тому, что трафик убегает наружу. Это так потому, что, во-первых, на то они и немаршрутизируемые; во-вторых, в таких системах обычно настраивают различные ACL, а они настраиваются для IP, в других местах, не на конкретной машине с микросервисом, да и пальцы у настраивающих ACL дрожат по-иному.

Тут, впрочем, необходимо отметить некоторые тонкости: ping 010.010.010.010 -- на многих и многих системах отправит пакеты в сторону серверов Google (проверьте). Я раньше рекомендовал использовать этот довольно хитрый "оборот" в рамках собеседований на должность сетевого инженера/разработчика (теперь уже смысла, понятно, нет), поскольку понимание того, почему здесь пакеты уходят в сторону сети Google, раскрывает основную часть опасений, связанных с использованием имён хостов в конфигах. Но всё же, в 010.010.010.010 - более одной "опечатки".

Tags:
Total votes 5: ↑3 and ↓2+4
Comments1

Из Let's Encrypt сообщают, что выпустили первый TLS-сертификат сроком действия шесть дней. Сделать такие TLS-сертификаты доступными для всех планируют к концу 2025 года. Короткоживущие сертификаты не будут содержать ни ссылки на OCSP-респондер, ни ссылки на точку раздачи CRL. То есть, никаких механизмов проверки статуса (отзыва) в сертификате не предусмотрено. Такой вариант допускается для короткоживущих сертификатов требованиям CA/B-форума (организация, через которую определяются требования к УЦ, корневые ключи которых включаются в дистрибутивы браузеров).

Для подключения шестидневных сертификатов нужна поддержка соответствующих профилей в ACME-клиенте. Очевидно, заказ короткоживущих сертификатов для легитимных, - долгоживущих, - сайтов имеет смысл выполнять только полностью автоматически. Зато такие сертификаты обещают и для IP-адресов, что удобно в ряде сценариев использования. DNS для подтверждения управления IP-адресами не подходит. Поэтому проверяется только факт управления узлом под заданным IP-адресом, а не доменной зоной. И такая проверка будет происходить не только по HTTP, но и довольно экзотическим методом TLS-ALPN, который целиком работает на уровне TLS и вообще не виден для веб-сервера, работающего выше TLS.

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

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

Эта строгая тенденция к снижению срока действия сертификатов, которым браузеры соглашаются верить, достаточно давняя - ей около десяти лет. А хорошим подтверждением курса на "сверхкороткие" сертификаты является то, что в рекомендациях CA/B-форума для таких сертификатов уже закреплено отсутствие требования ссылки на CRL (OCSP сейчас не является обязательным для любых оконечных сертификатов).

Tags:
Total votes 3: ↑3 and ↓0+6
Comments5

Часто в разных скриптах, обрабатывающих серверные TLS-сертификаты, - скажем, для мониторинга, - в качестве источника "целевого" имени при выборе сертификата используется содержание Subject/CN (commonName). Предполагается, что в Subject/CN должно быть доменное имя. Вот типичный пример:

$ openssl x509 -in disruptive.pem -subject -noout -nameopt multiline | awk -F' = ' '/commonName/ {print $2}'
disrupted.zone

Однако, если речь про сертификаты для TLS в современном вебе и про имена, то полагаться тут на Subject нельзя. Нужно использовать другой фрагмент сертификата, а именно - расширение SAN (Subject Alternative Name).

Для извлечения расширения SAN при помощи OpenSSL x509 нужно использовать опцию -ext subjectAltName. Выдача состоит из списка, где каждому значимому элементу соотвествует префикс, обозначающий тип. DNS-имена OpenSSL выводит с префиксом "DNS" (кто бы мог подумать!). Пример:

$ openssl x509 -in google-com.cert.pem -noout -ext subjectAltName
X509v3 Subject Alternative Name: 
    DNS:*.google.com, DNS:*.appengine.google.com
[...]

Кроме "DNS" могут встретиться другие префиксы, обозначающие IP-адреса и т.д. Однако для обработки имён - нужны имена, то есть "DNS". Скрипт, конечно, несколько усложнится. Пример:

$ openssl x509 -in google-com.cert.pem -noout -ext subjectAltName \
> | awk 'NR>1{split($0,A,",");for(k in A){split(A[k],B,":"); if(B[1]~/DNS/){print B[2]}}}' \
> | wc -l
135

Причина использования SAN в том, что имя из поля Subject/CN оконечного (серверного) сертификата браузеры давно не используют в качестве идентификатора при валидации. А чтобы валидация сертификата для веб-узла прошла успешно (в браузере), необходимо наличие подходящего имени в SAN. Более того, современные требования для УЦ по выпуску TLS-сертификатов ("документы CA/B-форума") прямо не рекомендуют использование поля commonName в Subject оконечных сертификатов для веб-узлов. Это значит, что доменного имени в Subject может просто не оказаться, но сертификат (при прочих равных) будет валидным для браузера.

Tags:
Total votes 3: ↑3 and ↓0+4
Comments0

Information

Rating
399-th
Location
Москва, Москва и Московская обл., Россия
Registered
Activity