【问题标题】:Generate wildcard certificate on Kubernetes cluster with DigitalOcean for my Nginx-Ingress使用 DigitalOcean 在 Kubernetes 集群上为我的 Nginx-Ingress 生成通配符证书
【发布时间】:2023-03-26 19:32:01
【问题描述】:

我遵循了这个 DigitalOcean 指南https://www.digitalocean.com/community/tutorials/how-to-set-up-an-nginx-ingress-with-cert-manager-on-digitalocean-kubernetes,我遇到了一些很奇怪的事情。在主机名中设置通配符时,letsencrypt 无法颁发新证书。而当我只设置定义的子域时,它可以完美地工作。

这是我对域及其 api 的“工作”配置(这个工作完美):

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: my-ingress
  annotations:
    cert-manager.io/cluster-issuer: "letsencrypt-staging"
spec:
  tls:
  - hosts:
    - example.com
    - api.example.com
    secretName: my-tls
  rules:
  - host: example.com
    http:
      paths:
      - backend:
          serviceName: example-frontend
          servicePort: 80
  - host: api.example.com
    http:
      paths:
      - backend:
          serviceName: example-api
          servicePort: 80

相反,这是我尝试颁发的通配符证书,但无法留下“正在颁发”的消息。

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: my-ingress
  annotations:
    cert-manager.io/cluster-issuer: "letsencrypt-staging"
spec:
  tls:
  - hosts:
    - example.com
    - *.example.com
    secretName: my-tls
  rules:
  - host: example.com
    http:
      paths:
      - backend:
          serviceName: example-frontend
          servicePort: 80
  - host: api.example.com
    http:
      paths:
      - backend:
          serviceName: example-api
          servicePort: 80
      

唯一的区别是主机的第二行。有一个我不知道的微不足道的众所周知的解决方案吗?我是 Kubernetes 新手,但不是 DevOps。

【问题讨论】:

  • 您好,documentation 声明要生成wildcard 证书,您需要使用DNS-01 质询而不是HTTP-01(在链接中使用)。在这里您可以找到一些可以帮助您的文档:cert-manager.io/docs/configuration/acme/dns01
  • 就是这样!抱歉,我花了一些时间,但我必须重建整个系统并正确测试它。如果您愿意,可以将其发布为答案!谢谢!
  • 嗨!您的问题两次包含相同的源代码。我认为第二个代码应该显示您的证书的配置。您能否更新您的问题,使其变得更有帮助?

标签: nginx ssl kubernetes kubernetes-ingress


【解决方案1】:

使用cert-manager (letsencrypt) 生成通配符证书需要使用DNS-01 质询而不是HTTP-01 used in the link from the question

Let's Encrypt 是否颁发通配符证书?

是的。通配符发行必须通过 ACMEv2 使用 DNS-01 质询来完成。有关更多技术信息,请参阅this post

有一个关于使用cert-manager 生成wildcard 证书的文档:


从DigialOcean的角度来看,有专门针对它的指南:

此提供程序使用 Kubernetes Secret 资源来工作。在下面的 例如,Secret 必须命名为 digitalocean-dns 并具有 子键access-token,其中包含令牌。例如:

apiVersion: v1
kind: Secret
metadata:
  name: digitalocean-dns
  namespace: cert-manager
data:
  # insert your DO access token here
  access-token: "base64 encoded access-token here"

访问令牌必须具有写入权限。

要创建个人访问令牌,请参阅DigitalOcean documentation

方便的直接链接:https://cloud.digitalocean.com/account/api/tokens/new

要将您的访问令牌编码为 base64,您可以使用以下代码

echo -n 'your-access-token' | base64 -w 0
apiVersion: cert-manager.io/v1
kind: Issuer
metadata:
  name: example-issuer
spec:
  acme:
    ...
    solvers:
    - dns01:
        digitalocean:
          tokenSecretRef:
            name: digitalocean-dns
            key: access-token

-- Cert-manager.io: Docs: Configuration: ACME: DNS-01: Digitalocean


我认为这些额外的资源也会有所帮助:

【讨论】:

    【解决方案2】:

    通配符证书需要DNS-01 方法

    注意:您可能需要先在 DNS 中添加 CAA 记录。

    CAA 记录可以添加到 DNS 区域中

    示例

                Type       Value
    
    devops.in   CAA       0 issuewild "letsencrypt.org"
    

    https://sslmate.com/caa/获取详细信息

    首先,您必须使用命令创建用于存储access key 的秘密

    kubectl create secret generic route53-secret --from-literal=secret-access-key="skjdflk4598sf/dkfj490jdfg/dlfjk59lkj"
    

    这里分享例子issuer.yaml

    apiVersion: cert-manager.io/v1
    kind: Issuer
    metadata:
      name: letsencrypt-prod
    spec:
      acme:
        email: test123@gmail.com
        server: https://acme-v02.api.letsencrypt.org/directory
        privateKeySecretRef:
          name: letsencrypt-prod
        solvers:
        - selector:
            dnsZones:
              - "devops.in"
          dns01:
            route53:
              region: us-east-1
              hostedZoneID: Z2152140EXAMPLE
              accessKeyID: AKIA5A5D7EXAMPLE
              secretAccessKeySecretRef:
                name: route53-secret
                key: secret-access-key
    ---
    apiVersion: cert-manager.io/v1alpha2
    kind: Certificate
    metadata:
      name: le-crt
    spec:
      secretName: tls-secret
      issuerRef: 
        kind: Issuer
        name: letsencrypt-prod
      commonName: "*.devops.in"
      dnsNames:
        - "*.devops.in" 
    

    另外,请确保您的用户拥有管理 Route53 的必要权限

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Action": "route53:GetChange",
          "Resource": "arn:aws:route53:::change/*"
        },
        {
          "Effect": "Allow",
          "Action": "route53:ChangeResourceRecordSets",
          "Resource": "arn:aws:route53:::hostedzone/*"
        },
        {
          "Effect": "Allow",
          "Action": "route53:ListHostedZonesByName",
          "Resource": "*"
        }
      ]
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-10
      • 2019-09-05
      • 1970-01-01
      • 2018-08-14
      • 2021-07-07
      • 1970-01-01
      • 2019-12-29
      • 2021-12-24
      相关资源
      最近更新 更多