Cert-Manager 证书更新过程 - 它是如何执行的?

Posted

技术标签:

【中文标题】Cert-Manager 证书更新过程 - 它是如何执行的?【英文标题】:Cert-Manager Certificate Renewal process - How it is performed? 【发布时间】:2020-01-14 02:55:19 【问题描述】:

我正在使用从其helm chart 安装的cert-manager-v0.10.0

我正在使用类似入口控制器的 kong 来管理入口操作。

所以我创建了一个 ClusterIssuer 资源,以便可以通过 kong-ingress 控制器从 Ingress 资源联系它。

ClusterIssuer 是这样的:

   apiVersion: certmanager.k8s.io/v1alpha1
   kind: ClusterIssuer
   metadata:
     name: letsencrypt-prod
   spec:
     acme:
       # The ACME server URL
       server: https://acme-v02.api.letsencrypt.org/directory
       # Email address used for ACME registration
       email: username@mydomain.org
       # Name of a secret used to store the ACME account private key
       privateKeySecretRef:
         name: letsencrypt-prod
       # Enable the HTTP-01 challenge provider
       solvers:
       - http01:
           ingress:
             class: kong

我正在使用的入口资源是这个。

您可以在这里看到,我将它指向之前创建的 ClusterIssuer,并且 根据其中包含的kubernetes.io/ingress.class: "kong" 注释,我还将它指向 kong 作为入口控制器:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    # add an annotation indicating the issuer to use.
    certmanager.k8s.io/cluster-issuer: letsencrypt-prod # letsencrypt-staging
    kubernetes.io/ingress.class: "kong"
    plugins.konghq.com: swaggerapi-customer-production-basic-auth, swaggerapi-customer-production-acl
  name: production-customer-ingress-app
  # namespace: default
spec:
  rules:
  - host: appprod.mydomain.org
    http:
      paths:
      - backend:
          serviceName: customer-production-app
          servicePort: 80
        path: /comcustomerpr
  tls: # < placing a host in the TLS config will indicate a cert should be created
  - hosts:
    - appprod.mydomain.org
    secretName: letsencrypt-prod # < cert-manager will store the created certificate in this secret.

因此,当我在上面创建 Ingress 资源时,会创建上面在我的 ingress 中引用的 secretName,并且还会创建一个同名的证书资源......即letsencrypt-prod

它将是证书资源接收LetsEncrypt验证成功的过程......

我得到了 TLS 加密,这里一切正常。

但是现在,我想知道续订过程将如何。因为我现在很确定这个更新证书过程不会自动发生......

我在这里阅读了 https://docs.cert-manager.io/en/latest/reference/certificates.html?highlight=renewal#certificate-duration-and-renewal-window 的内容,该文档说有必要附加到以这种方式创建的证书资源 (kind:Certificate) spec.durationspec.renewBefore 属性

spec:
  secretName: example-tls
  duration: 24h
  renewBefore: 12h

如果我的 LetsEncrypt 颁发的证书的默认期限为 90 天,我该如何指定这些 spec.durationspec.renewBefore 属性?

我想解决这个问题,因为我的主要问题是我没有创建证书,它是在执行 Ingress 资源(上面引用的)时创建的。

如何使用我正在做的这种方法来解决这里的续订过程?

更新

我是否需要创建一个特定的 kind:Certificate 资源,引用我从 LetsEncrypt 获得的秘密?

我的意思是,像这样的东西?

apiVersion: certmanager.k8s.io/v1alpha1
kind: Certificate
metadata:
  name: letsencrypt-prod
spec:
  secretName: letsencrypt-prod
  dnsNames:
  - mydomain.com
  acme:
    config:
    - http01:
        ingressClass: kong
      domains:
      - mydomain.com
  issuerRef:
    name: letsencrypt-prod
    kind: ClusterIssuer

我有疑问,因为目前我没有收到证书更新操作

【问题讨论】:

【参考方案1】:

由于您使用了 letsencrypt-prod 颁发者,并且没有做任何特殊/非标准的事情,证书更新过程将完全自动为您服务。

默认情况下,letsencrypt 证书的有效期为 90 天,并且每 30 天自动更新一次。如果您对使用购买的证书或使用其他特定的证书颁发机构没有严格要求,这是一个很好的选择。

如果您仍然有疑问,那么您可以执行以下操作以自己查看。首先解码当前证书机密数据并使用openssl 命令检查证书内容。您将能够看到证书的到期日期,并记下它。现在,如果您从该到期日期中减去 59 天,这应该会为您提供 cert-manager 尝试续订证书的大致日期。为了安全起见,我增加了额外的一天,我们不会太早。然后在该日期再次重复此过程;解码证书机密,使用openssl 命令检查证书,并检查证书到期日期。您会注意到证书的到期日期与以前不同,因此它已按照我们的预期自动续订。

希望这会有所帮助。

【讨论】:

我认为是自动更新过程,但我有疑问,因为几个月前我做了同样的过程(创建证书,使用kongcert-manager-v0.7.0 并与letsencrypt交谈)有效期已过期,自动续订过程从未发生过,我不得不重新创建入口过程,以便 kong 和 cert-manager 再次交谈 letencrypt 以获得新证书... 我可以做到你说的,我认为是检查这种行为的最佳选择,但我对如何修改有效期有疑问......我的意思是我需要修改证书...我找到了如何检查其信息,但不确定如何减去具体的天数... @bgarcial 你解决了这个问题吗?我有同样的问题 @NehaM,现在这个过程是完全自动的,Let's Encrypt 会处理这个。 我以前经历过两次。完全 vanilla cert-manager k8s 安装,但在到期时,证书没有更新,这让我争先恐后地强制更新。两次之前我不得不拆除整个配置并重新创建它。我即将看到这种情况再次发生。

以上是关于Cert-Manager 证书更新过程 - 它是如何执行的?的主要内容,如果未能解决你的问题,请参考以下文章

HTTPS证书通过cert-manager自动获取,部署,续期

Kubernetes集群——Cert-manager与Let'sencrypt证书自动管理

K8s 中使用 cert-manager 申请免费 Https 证书

Cert Manager 申请SSL证书流程及相关概念-二

Cert Manager 申请SSL证书流程及相关概念-三

Cert-Manager 实现 K8s 服务域名证书自动化续签