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...
, и отклонит запрос. Но, похоже, этого не происходит.
Идеи?