Рейтинг:0

mTLS: ограничить сертификат клиента определенным поддоменом?

флаг pk
Joe

tldr

Через mTLS я пытаюсь найти способ выдачи сертификата клиента, который предоставляет этому клиенту доступ только к определенному поддомену. У меня есть подозрение, что это невозможно, но я не уверен.

Что я пытаюсь сделать

Допустим, у меня есть сервер, прослушивающий все, что направляется на *.foo.flar.com

Каждому клиенту назначается собственный поддомен, который удовлетворяет подстановочному знаку в адресе сервера.

Например, клиент1 должен получить доступ к серверу через customer1.foo.flar.com, и клиент2 должен получить доступ к серверу через customer2.foo.flar.com.

Кроме того, необходимо запретить одному клиенту доступ к серверу с использованием субдомена другого клиента. Таким образом, это незаконно для клиент1 запрашивать customer2.foo.flar.com, и такой запрос должен быть отклонен.

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

Как у меня все настроено

Я новичок в использовании TLS, так что многое из этого пришло из этот ТАК ответ о конфигурации SAN и эта статья о базовой конфигурации mTLS.

Я пропустил здесь некоторые вещи, такие как генерация сертификата CA и генерация клиентского и серверного CSR, чтобы попытаться сосредоточить внимание на вещах, но могу добавить их, если хотите.

Я создал сертификат сервера, используя что-то вроде:

OpenSSL x509 \
  -треб \
  -extfile <(printf "subjectAltName=DNS:*.foo.flar.com") \
  -дней 365\
  -в server.csr \ 
  -CA ca.crt \
  -CAkey ca.key \
  -CAСоздать серийный номер \
  -out server.crt

Затем я создал сертификат клиента, используя что-то вроде:

OpenSSL x509 \
  -треб \
  -extfile <(printf "subjectAltName=DNS:customer1.foo.flar.com") \
  -дней 365\
  -в клиент.csr \ 
  -CA ca.crt \
  -CAkey ca.key \
  -CAСоздать серийный номер \
  -out client.crt

Сервер (написанный на Go) настроен на запрос и проверку клиентских сертификатов.

Эта проблема

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

Если у меня есть клиент, выдавший клиент1 cert вызов сервера по адресу customer1.foo.flar.com, соединение успешно.

Однако, если у меня есть клиент, выпустивший клиент1 cert вызов сервера по адресу customer2.foo.flar.com, это соединение также успешно, хотя я ожидал, что оно потерпит неудачу.

Я надеялся, что при проверке сертификата клиента сервер увидит, что клиент1 не имеет доступа к клиент2..., и отклонит запрос. Но, похоже, этого не происходит.

Идеи?

Рейтинг:3
флаг se

Сертификаты клиента содержат только информацию для аутентификации пользователя. Любые ограничения на то, что может делать аутентифицированный пользователь (авторизация), включая то, на каком сайте будет принят сертификат, зависят от сервера, который проверяет сертификат.

флаг pk
Joe
Таким образом, установка значений SAN для клиентского сертификата носит чисто информационный характер и в противном случае не имеет никакого эффекта?
флаг pk
Joe
На самом деле, теперь, когда я думаю об этом больше, я думаю, что это имеет смысл. Поскольку рукопожатие TLS происходит до того, как сервер узнает, какой ресурс запрашивается, у TLS не будет возможности предпринять значимые действия.
Nikita Kipriyanov avatar
флаг za
Что делает сертификат уникальным, чего достаточно, чтобы отличить сертификат от других, т.е. аутентифицировать? Фактическое «подписанное» значение в сертификате — это открытый ключ, и то, что делает его сертификатом, — это подпись ЦС, которая покрывает этот ключ.Ключ важен, потому что он используется в реальной асимметричной криптографии. Все остальное "чисто информационное", однако с некоторыми элементами типа DN работать проще и их можно сделать уникальными, например. доступный для аутентификации.
Steffen Ullrich avatar
флаг se
@NikitaKipriyanov: *Все остальное "чисто информационное"* - не согласен. Помимо открытого ключа, существуют ограничения на использование ключа, назначение сертификата ..., которые имеют четко определенное значение и стандарты того, как с ними следует обращаться. Существует также SAN (и более старый: CN), который имеет четко определенное и стандартизированное значение в контексте сертификатов сервера и протоколов, таких как HTTPS, SMTP, IMAP, .... Однако такого стандарта для ограничения клиентских сертификатов доменами не существует.
Nikita Kipriyanov avatar
флаг za
Фактическая *аутентификация*, определяемая как процесс оценки личности актора, математически привязана к ключу и *только* к ключу. Закрытый ключ хранится в секрете какой-то сущностью, и, поскольку актер может расшифровать вызов, который мы зашифровали с помощью его открытого ключа, означает, что он и есть эта сущность. Тип объекта записывается в сертификате, и достоверность этой информации подписывается ЦС. В случае веб-сайта идентификатором является его имя, поэтому мы подписываем вместе ключ и SAN. В случае клиентского сертификата мы можем использовать сам ключ в качестве идентификатора сущности, как и SSH.
Nikita Kipriyanov avatar
флаг za
Назначение сертификата, ограничения на использование ключа и т. д. не играют никакой роли в процессе аутентификации. Если вызов был правильно расшифрован, мы точно знаем, что у другой стороны есть закрытый ключ. Если можно установить подлинность открытого ключа (например, используя какое-либо поле сертификата, например, SAN), они фактически аутентифицируют другую сторону. Все остальные поля носят более информационный характер и связаны с авторизацией. И вы правы (в ответе), это зависит от другой стороны, могут ли они использовать эту информацию.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.