繁体   English   中英

如何通过证书管理器在 Kubernetes 中正确设置 TLS?

[英]How to setup TLS correctly in Kubernetes via cert-manager?

我正在尝试为 Kubernetes 集群 (AWS EKS) 之外可用的服务设置 TLS。 使用 cert-manager,我已经成功颁发了证书并配置了入口,但我仍然收到错误NET::ERR_CERT_AUTHORITY_INVALID 这是我所拥有的:

  1. 命名空间testshello-kubernetes在其中(部署和服务都具有名称hello-kubernetes-first ,服务是具有port 80 和targetPort port 8080 的 ClusterIP,部署基于paulbouwer/hello-kubernetes:1.8 ,请参阅我之前的问题中的详细信息)

  2. DNS 和入口配置为显示服务:

     apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: hello-kubernetes-ingress namespace: tests spec: ingressClassName: nginx rules: - host: test3.projectname.org http: paths: - path: "/" pathType: Prefix backend: service: name: hello-kubernetes-first port: number: 80

    如果不配置 TLS,我可以通过 http 访问 test3.projectname.org 并查看服务(好吧,它尝试将我重定向到 https,我看到NET::ERR_CERT_AUTHORITY_INVALID ,无论如何我都会进入不安全状态并查看 hello-kubernetes 页面)。

    • 注意:我有 nginx-ingress入口控制器 它是通过以下图表在我之前安装的:

       apiVersion: v2 name: nginx description: A Helm chart for Kubernetes type: application version: 4.0.6 appVersion: "1.0.4" dependencies: - name: ingress-nginx version: 4.0.6 repository: https://kubernetes.github.io/ingress-nginx

      和图表应用的值覆盖与原始值不同,主要在extraArgsdefault-ssl-certificate: "nginx-ingress/dragon-family-com" is uncommneted

  3. 通过kubectl apply -f https://github.com/jetstack/cert-manager/releases/download/v1.5.4/cert-manager.yaml安装的证书管理器

  4. ClusterIssuer使用以下配置创建:

     apiVersion: cert-manager.io/v1 kind: ClusterIssuer metadata: name: letsencrypt-backoffice spec: acme: server: https://acme-staging-v02.api.letsencrypt.org/directory # use https://acme-v02.api.letsencrypt.org/directory after everything is fixed and works privateKeySecretRef: # this secret is created in the namespace of cert-manager name: letsencrypt-backoffice-private-key # email: <will be used for urgent alerts about expiration etc> solvers: # TODO: add for each domain/second-level domain/*.projectname.org - selector: dnsZones: - test.projectname.org - test2.projectname.org - test3.projectname.org http01: ingress: class: nginx
  5. tests命名空间中的证书 它的配置是

    apiVersion: cert-manager.io/v1 kind: Certificate metadata: name: letsencrypt-certificate-31 namespace: tests spec: secretName: tls-secret-31 issuerRef: kind: ClusterIssuer name: letsencrypt-backoffice commonName: test3.projectname.org dnsNames: - test3.projectname.org

现在,证书已准备就绪( kubectl get certificates -n tests说明了这一点)并应用它,我将其添加到 ingress 的规范中:

  tls:
    - hosts:
      - test3.projectname.org
      secretName: tls-secret-31

但是,当我尝试通过 https 打开 test3.projectname.org 时,它仍然显示NET::ERR_CERT_AUTHORITY_INVALID错误。 我究竟做错了什么? 如何调试这个? 我检查了openssl s_client -connect test3.projectname.org:443 -prexit *并显示以下链:

 0 s:CN = test3.projectname.org
   i:C = US, O = (STAGING) Let's Encrypt, CN = (STAGING) Artificial Apricot R3
 1 s:C = US, O = (STAGING) Let's Encrypt, CN = (STAGING) Artificial Apricot R3
   i:C = US, O = (STAGING) Internet Security Research Group, CN = (STAGING) Pretend Pear X1
 2 s:C = US, O = (STAGING) Internet Security Research Group, CN = (STAGING) Pretend Pear X1
   i:C = US, O = (STAGING) Internet Security Research Group, CN = (STAGING) Doctored Durian Root CA X3

并告诉,除其他输出

验证错误:无法获取本地颁发者证书

不幸的是,我没有发现任何有用的东西可以进一步尝试,因此感谢您的帮助。

您的 ClusterIssuer 是指 LetsEncrypt 临时发行者。 删除该设置/默认应使用其生产设置。

按照 SYN 的建议,我已经解决了这个问题

  1. 将 ClusterIssuer 配置中的 ACME 服务器从https://acme-staging-v02.api.letsencrypt.org/directory切换到https://acme-v02.api.letsencrypt.org/directory 临时服务器的想法似乎是:允许调试证书颁发(以便kubectl get certificate [-n <namespace>]显示READY = true )而不提供实际的可信证书; 证书颁发完成后,必须切换到主服务器才能获得生产证书。

  2. 更新证书、tls 机密和入口配置。 好吧,我不确定是否有办法实际更新证书; 相反,我创建了新的,它创建了新的秘密,然后更新了入口配置(只是秘密的名称)

您的证书不起作用的原因,不是因为您使用了登台服务器,而是因为您没有在 Ingress 规则中指定tls对象。 Certbot 的暂存仅用于测试目的,并且如果您每小时请求超过 5 个证书,则不会在您测试时“禁止”您。 当您确认一切都按预期工作时,您可以使用普通的非登台服务器。

应该这样做:

集群发行者对象

apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: letsencrypt-prod
spec:
  acme:
    server: https://acme-v02.api.letsencrypt.org/directory
    email: user@example.com
    privateKeySecretRef:
      name: letsencrypt-prod
    solvers:
    - http01:
        ingress:
          class: nginx

入口对象

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: hello-kubernetes-ingress
  namespace: tests
  labels:
    app: hello-kubernetes-ingress
  annotations:
    kubernetes.io/ingress.class: "nginx"
    cert-manager.io/cluster-issuer: letsencrypt-prod
spec:
  tls:
  - hosts:
    - test3.projectname.org
    secretName: hello-tls
  rules:
  - host: test3.projectname.org
    http:
      paths:
      - pathType: ImplementationSpecific
        path: "/"
        backend:
          service:
            name: hello-kubernetes-ingress
            port: 
              number: 80

证书和密钥存储在名为“hello-tls”的机密中,您在初始示例中也没有指定该机密,因此您收到了失败。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM