Как исправить ответы диспетчера сертификатов на проблемы Let's Encrypt ACME при использовании аутентификации сертификата клиента в Kubernetes с входом nginx?

Мы настроили новый входящий маршрут, для которого требуется проверка подлинности сертификата TLS, и разместили его на собственном поддомене, но мы обнаруживаем, что cert-manager не может выдать для него сертификат.

Используя приведенные здесь примеры, мы сгенерировали сертификат CA и ключ CA, а затем настроили сертификат клиента: https://github.com/kubernetes/ingress-nginx/tree/master/docs/examples/auth/client-certs

В журналах я вижу, что все .acme-challenge запросы возвращают 403. Я предполагаю, что nginx отклоняет запросы, потому что Let's Encrypt не может предоставить сертификат клиента для запроса вызова. Что мне нужно сделать, чтобы обойти требование сертификата клиента для ACME?


person GuyPaddock    schedule 13.08.2020    source источник


Ответы (1)


Проблема заключалась в том, что мы неправильно настроили аннотацию nginx.ingress.kubernetes.io/auth-tls-secret. Он должен быть в формате namespace/name, где namespace - это пространство имен, которое содержит секрет, содержащий сертификат CA клиента, а name - имя этого секрета, но мы предоставляли только имя, поскольку секрет находится в том же пространстве имен с входом.

Мне удалось диагностировать проблему, сбросив конфигурацию контроллера входящего трафика nginx в nginx.conf.txt с помощью:

  kubectl exec <NAME OF INGRESS CONTROLLER POD> -n <INGRESS NAMESPACE> -- nginx -T | tee nginx.conf.txt

(По материалам https://docs.nginx.com/nginx-ingress-controller/troubleshooting/#checking-the-generated-config).

Это включало следующий фрагмент:

    ## start server the.hostname.com
    server {
        server_name the.hostname.com ;
        
        listen 80;
        
        set $proxy_upstream_name "-";
        set $pass_access_scheme $scheme;
        set $pass_server_port $server_port;
        set $best_http_host $http_host;
        set $pass_port $pass_server_port;
        
        listen 443  ssl http2;
        
        # PEM sha: 66c07c44ba9637a23cd3d7b6ebce958e08a52ccb
        ssl_certificate                         /etc/ingress-controller/ssl/default-fake-certificate.pem;
        ssl_certificate_key                     /etc/ingress-controller/ssl/default-fake-certificate.pem;
        
        ssl_certificate_by_lua_block {
            certificate.call()
        }
        
        # Location denied, reason: invalid format (namespace/name) found in 'the-secret-name'
        return 403;
        
    }
    ## end server the.hostname.com

Ключ в этих двух строках:

        # Location denied, reason: invalid format (namespace/name) found in 'the-secret-name'
        return 403;

Это указывало мне на аннотацию к секретному имени. Как только я это исправил, ACME заработал правильно.

person GuyPaddock    schedule 13.08.2020