Nginx Ingress: передача информации о сертификате клиента в бэкэнд

Я успешно реализовал в своем кластере aks вход с сертификатом TLS (https://docs.microsoft.com/en-us/azure/aks/ingress-own-tls), но я хотел бы передать информацию, содержащуюся в сертификате клиента, на бэкэнд. Я попытался добавить к своему входу аннотацию nginx.ingress.kubernetes.io/auth-tls-pass-certificate-to-upstream: "true", но эта информация, похоже, отсутствует в моих заголовках запросов (я просто печатаю содержимое request.headers из моего приложения-фляги). Остальные заголовки отображаются правильно, например X-Forwarded-Proto: https или X-Forwarded-Port: 443.

Может ли кто-нибудь подтвердить ожидаемое поведение аннотации?

Нужно ли мне как-то настраивать бэкэнд с tls?

РЕДАКТИРОВАТЬ

Я получил доступ к модулю входа, и в конфигурации nginx я не смог найти никакой ссылки на ssl_client_s_dn, который, как я ожидал, будет лучшим кандидатом для передачи информации о сертификате в заголовок.

Я попытался назначить несколько настраиваемых заголовков, следуя инструкциям в https://github.com/kubernetes/ingress-nginx/tree/master/docs/examples/customization/custom-headers, но это тоже не работает.


person Neo    schedule 14.05.2020    source источник


Ответы (2)


Какую версию nginx-ingress вы используете?

По крайней мере, с версией 0.30 я тоже могу правильно видеть детали сертификата клиента, переданные в бэкэнд.

Значение ssl_client_s_dn передается как заголовок Ssl-Client-Subject-Dn с настройкой контроллера nginx по умолчанию, настройка не требуется.

Вот содержимое моего /etc/nginx/nginx.conf по умолчанию (преобразовано из ConfigMap)

# Pass the extracted client certificate to the backend

        proxy_set_header ssl-client-cert        $ssl_client_escaped_cert;

        proxy_set_header ssl-client-verify      $ssl_client_verify;
        proxy_set_header ssl-client-subject-dn  $ssl_client_s_dn;
        proxy_set_header ssl-client-issuer-dn   $ssl_client_i_dn;

Заголовки запросов с точки зрения серверной части:

   ...
    "Ssl-Client-Issuer-Dn": "CN=example.com,O=example Inc.", 
    "Ssl-Client-Subject-Dn": "O=client organization,CN=client.example.com", 
    "Ssl-Client-Verify": "SUCCESS", 
    "User-Agent": "curl/7.58.0", 
    "X-Forwarded-Host": "httpbin.example.com", 
    "X-Scheme": "https", 
  }
}

Вы всегда можете добавить свои собственные заголовки, как описано в здесь

Пример:

apiVersion: v1
data:
  X-Client-Cert-Info: $ssl_client_s_dn
kind: ConfigMap
metadata:
...

что отражается на бэкэнде как:

    ...
    "X-Client-Cert-Info": "O=client organization,CN=client.example.com", 
    "X-Forwarded-Host": "httpbin.example.com", 
    "X-Scheme": "https", 
  }
}
person Nepomucen    schedule 22.05.2020

вы можете передавать аннотации в сервисе nginx ingress, это

   annotations:
    service.beta.kubernetes.io/aws-load-balancer-connection-idle-timeout: '60'
    service.beta.kubernetes.io/aws-load-balancer-proxy-protocol: "*"

Если вы хотите изменить заголовок на основе правила входа, вы также можете добавить аннотации к правилам входа.

person ANISH KUMAR MOURYA    schedule 21.05.2020