Kubernetes Nginx Ingress с Cert Manager и letsencrypt не допускает подстановочных символов в доменных именах
У меня есть автономный кластер Kubernetes с Nginx Ingress. В кластере также работает Cert-manager, с помощью которого я пытаюсь получить действительные SSL-сертификаты с помощью Letsencrypt. Все работает, и я получаю действительный сертификат для example.com, www.example.com или app1.example.com, но не для общего подстановочного знака *.example.com. Если я попытаюсь каким-либо образом ввести подстановочный знак при входе в раздел sec.tls.hosts, мне не будет создан сертификат. Я получаю результат для
kubectl get certificate
NAME READY SECRET AGE
tls-test-cert False tls-electi-cert 20h
kubectl get CertificateRequest
NAME APPROVED DENIED READY ISSUER REQUESTOR AGE
tls-test-cert-8jw75 True False letsencrypt-staging system:serviceaccount:cert-manager:cert-manager 18m
kubectl describe CertificateRequest
[...]
Status:
Conditions:
Last Transition Time: 2022-02-27T13:54:38Z
Message: Certificate request has been approved by cert-manager.io
Reason: cert-manager.io
Status: True
Type: Approved
Last Transition Time: 2022-02-27T13:54:38Z
Message: Waiting on certificate issuance from order gateway/tls-test-cert-8jw75-1425588341: "pending"
Reason: Pending
Status: False
Type: Ready
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal cert-manager.io 18m cert-manager Certificate request has been approved by cert-manager.io
Normal OrderCreated 18m cert-manager Created Order resource gateway/tls-test-cert-8jw75-1425588341
Normal OrderPending 18m cert-manager Waiting on certificate issuance from order gateway/tls-test-cert-8jw75-1425588341: ""
Мой Nginx Ingress: (для этого поста я поменял свой домен на example.com)
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: test-management
namespace: gateway
annotations:
kubernetes.io/ingress.class: nginx
cert-manager.io/cluster-issuer: "letsencrypt-staging"
nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
nginx.ingress.kubernetes.io/ssl-redirect: "true"
nginx.ingress.kubernetes.io/backend-protocol: "HTTP"
spec:
ingressClassName: nginx
tls:
- secretName: tls-test-cert
hosts:
- example.com
- '*.example.com'
rules:
- host: example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: test-gateway
port:
number: 80
- host: '*.example.com'
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: test-gateway
port:
number: 80
Эмитент: (Я отредактировал свой адрес электронной почты здесь)
apiVersion: cert-manager.io/v1
kind: Issuer
metadata:
name: letsencrypt-staging
namespace: cert-manager
spec:
acme:
server: https://acme-staging-v02.api.letsencrypt.org/directory
email: *******
privateKeySecretRef:
name: letsencrypt-staging
solvers:
- http01:
ingress:
class: nginx
Мой обратный прокси (тест-шлюз) определенно работает и перенаправляет все поддомены на мой сайт. Заранее благодарим за любые идеи относительно того, что может быть причиной этого.
1 ответ
Спасибо за помощь, мне удалось решить мою проблему:
По сути, мне пришлось найти новый подход, поскольку с помощью http01 невозможно выдать сертификат wild card. (см. здесь: https://cert-manager.io/docs/configuration/acme/ ) После небольшого исследования я пришел к выводу, что наиболее разумно использовать решатель dns01. Документацию можно найти здесь: https://cert-manager.io/docs/configuration/acme/dns01/ .
Поскольку конфигурация dns01 сильно зависит от вашего DNS-провайдера, я не буду публиковать здесь свое решение, но полезную конфигурацию можно легко найти в документации.