SSL-сертификаты на Kubernetes с использованием ACME

#ssl #kubernetes

#ssl #kubernetes

Вопрос:

Я следил за этим руководством: https://cert-manager.io/docs / , и после того, как я установил свой менеджер сертификатов и убедился, что они работают с kubectl, получите pods —namespace cert-manager,

 cert-manager-5597cff495-l5hjs             1/1     Running   0          91m
cert-manager-cainjector-bd5f9c764-xrb2t   1/1     Running   0          91m
cert-manager-webhook-5f57f59fbc-q5rqs     1/1     Running   0          91m
 

Затем я настроил свой cert-manager с помощью ACME issuer, следуя этому руководству https://cert-manager.io/docs/configuration/acme / .

 apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: letsencrypt-staging
spec:
  acme:
    # You must replace this email address with your own.
    # Let's Encrypt will use this to contact you about expiring
    # certificates, and issues related to your account.
    email: aidenhsy@gmail.com
    server: https://acme-staging-v02.api.letsencrypt.org/directory
    privateKeySecretRef:
      # Secret resource that will be used to store the account's private key.
      name: letsencrypt-staging
    # Add a single challenge solver, HTTP01 using nginx
    solvers:
      - http01:
          ingress:
            class: nginx
 

Вот мой полный конфигурационный файл ingress:

 apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: ingress-srv
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/use-regex: 'true'
spec:
  rules:
    - host: www.hyhaus.xyz
      http:
        paths:
          - path: /api/?(.*)
            backend:
              serviceName: devback-srv
              servicePort: 4000
          - path: /?(.*)
            backend:
              serviceName: devfront-srv
              servicePort: 3000
---
apiVersion: v1
kind: Service
metadata:
  annotations:
    service.beta.kubernetes.io/do-loadbalancer-enable-proxy-protocol: 'true'
    service.beta.kubernetes.io/do-loadbalancer-hostname: 'www.hyhaus.xyz'
  labels:
    helm.sh/chart: ingress-nginx-2.0.3
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/version: 0.32.0
    app.kubernetes.io/managed-by: Helm
    app.kubernetes.io/component: controller
  name: ingress-nginx-controller
  namespace: ingress-nginx
spec:
  type: LoadBalancer
  externalTrafficPolicy: Local
  ports:
    - name: http
      port: 80
      protocol: TCP
      targetPort: http
    - name: https
      port: 443
      protocol: TCP
      targetPort: https
  selector:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/component: controller

---
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: letsencrypt-staging
spec:
  acme:
    # You must replace this email address with your own.
    # Let's Encrypt will use this to contact you about expiring
    # certificates, and issues related to your account.
    email: aidenhsy@gmail.com
    server: https://acme-staging-v02.api.letsencrypt.org/directory
    privateKeySecretRef:
      # Secret resource that will be used to store the account's private key.
      name: letsencrypt-staging
    # Add a single challenge solver, HTTP01 using nginx
    solvers:
      - http01:
          ingress:
            class: nginx
 

Однако, когда я перехожу на свой сайт, браузер предупреждает: сертификат безопасности не является доверенным операционной системой вашего компьютера. И когда я взглянул на свой сертификат, он показывает самоназначенный, что на самом деле не то, что я хочу. сертификатЯ делаю что-то не так?

Ответ №1:

Это заполнитель сертификата, предоставленный nginx ingress controller . Когда вы видите это, это означает, что для конечной точки нет другого (выделенного) сертификата.

Теперь первая причина, по которой это произошло, заключается в том, что у вас Ingress нет необходимых данных. Обновите его следующим образом:

 metadata:
  annotations:
    # which issuer to use
    cert-manager.io/cluster-issuer: "letsencrypt-staging"
spec:
  tls: # placing a host in TLS config indicates that a certificate should be created
  - hosts:
    - example.org
    - www.example.org
    - xyz.example.org
    secretName: myingress-cert # cert-manager will store the created certificate in this secret
 

Документация для объектов ingress находится здесь.

Если вышеуказанное не помогло, попробуйте выполнить действия по устранению неполадок, предлагаемые документацией. По моему опыту, проверки CertificateRequest и Certificate ресурсов в большинстве случаев было достаточно для определения проблемы.

 $ kubectl get certificate
$ kubectl describe certificate <certificate-name>
$ kubectl get certificaterequest
$ kubectl describe certificaterequest <CertificateRequest name>
 

Помните, что эти объекты имеют пространство имен, что означает, что они будут находиться в том же пространстве ingress имен, что и объект.

Ответ №2:

Чтобы защитить вход, сначала вам нужно добавить ClusterIssuer к вашим ресурсам входа, а затем cert-manager подберет его и создаст для вас ресурс сертификата. Kind : ingress metadata: annotations : cert-manager.io/cluster-issuer: nameOfClusterIssuer .

Во-вторых, вы должны добавить tls <= это указывает на создание сертификата (пары ключ / сертификат) Cert-manager через ClusterIssuer.

В-третьих, вы должны добавить secretName: myingress <= здесь менеджер сертификатов сохранит секреты tls (после создания пары ключ / сертификат и сохранит их для вас)..