腾讯云手把手教你使用cert-manager签发免费证书

时间:2021-07-15 | 标签: | 作者:Q8 | 来源:roc 陈鹏网络

小提示:您能找到这篇{腾讯云手把手教你使用cert-manager签发免费证书}绝对不是偶然,我们能帮您找到潜在客户,解决您的困扰。如果您对本页介绍的腾讯云手把手教你使用cert-manager签发免费证书内容感兴趣,有相关需求意向欢迎拨打我们的服务热线,或留言咨询,我们将第一时间联系您!

概述

< ">随着HTTPS不断普及,越来越多的网站都在从HTTP升级到HTTPS,使用HTTPS就需要向权威机构申请证书,需要付出一定的成本,如果需求数量多,也是一笔不小的开支。cert-manager是Kubernetes上的全能证书管理工具,如果对安全级别和证书功能要求不高,可以利用cert-manager[1]基于ACME[2]协议与Let's Encrypt[3]来签发免费证书并自动续期,实现永久免费使用证书。

cert-manager工作原理

< ">cert-manager部署到Kubernetes集群后,它会watch它所支持的CRD资源,我们通过创建CRD资源来指示cert-manager为我们签发证书并自动续期:

< ">解释下几个关键的资源:

< ">Issuer/ClusterIssuer:用于指示cert-manager用什么方式签发证书,本文主要讲解签发免费证书的ACME方式。ClusterIssuer与Issuer的唯一区别就是Issuer只能用来签发自己所在namespace下的证书,ClusterIssuer可以签发任意namespace下的证书。

< ">Certificate:用于告诉cert-manager我们想要什么域名的证书以及签发证书所需要的一些配置,包括对Issuer/ClusterIssuer的引用。

免费证书签发原理

< ">Let’s Encrypt利用ACME协议来校验域名是否真的属于你,校验成功后就可以自动颁发免费证书,证书有效期只有90天,在到期前需要再校验一次来实现续期,幸运的是cert-manager可以自动续期,这样就可以使用永久免费的证书了。如何校验这个域名是否属于你呢?主流的两种校验方式是HTTP-01和DNS-01,详细校验原理可参考Let's Encrypt的运作方式[4],下面将简单描述下。

HTTP-01校验原理

< ">HTTP-01的校验原理是给你域名指向的HTTP服务增加一个临时location,Let’s Encrypt会发送http请求到http:///.well-known/acme-challenge/,YOUR_DOMAIN就是被校验的域名,TOKEN是ACME协议的客户端负责放置的文件,在这里ACME客户端就是cert-manager,它通过修改或创建Ingress规则来增加这个临时校验路径并指向提供TOKEN的服务。Let’s Encrypt会对比TOKEN是否符合预期,校验成功后就会颁发证书。此方法仅适用于给使用Ingress暴露流量的服务颁发证书,并且不支持泛域名证书。

DNS-01校验原理

< ">DNS-01的校验原理是利用DNS提供商的API Key拿到你的DNS控制权限,在Let’s Encrypt为ACME客户端提供令牌后,ACME客户端(cert-manager)将创建从该令牌和您的帐户密钥派生的TXT记录,并将该记录放在_acme-challenge.。然后Let’s Encrypt将向DNS系统查询该记录,如果找到匹配项,就可以颁发证书。此方法不需要你的服务使用Ingress,并且支持泛域名证书。

校验方式对比

< ">HTTP-01的校验方式的优点是:配置简单通用,不管使用哪个DNS提供商都可以使用相同的配置方法;缺点是:需要依赖Ingress,如果你的服务不是用Ingress暴露流量的就不适用,而且不支持泛域名证书。



< ">DNS-01的校验方式的优点是没有HTTP-01校验方式缺点,不依赖Ingress,也支持泛域名;缺点就是不同DNS提供商的配置方式不一样,而且DNS提供商有很多,cert-manager的Issuer不可能每个都去支持,不过有一些可以通过部署实现了cert-manager的Webhook[5]的服务来扩展Issuer进行支持,比如DNSPod和阿里DNS,详细Webhook列表请参考:https://cert-manager.io/docs/configuration/acme/dns01/#webhook

< ">选择哪种方式呢?条件允许的话,建议是尽量用DNS-01的方式,限制更少,功能更全。

操作步骤

安装cert-manager

< ">通常直接使用yaml方式一键安装cert-manager到集群,参考官网文档Installing with regular manifests[6]。

< ">cert-manager官方使用的镜像在quay.io,国内拉取可能比较慢,也可以使用下面命令一键安装(使用同步到国内CCR的镜像):

kubectl apply--validate=false-f https://raw.githubusercontent.com/TencentCloudContainerTeam/manifest/master/cert-manager/cert-manager.yaml

< ">以上命令安装方式要求集群版本不低于1.16。

配置DNS

< ">登录你的DNS提供商后台,配置域名的DNS A记录,指向你需要证书的后端服务对外暴露的IP地址,以cloudflare为例:

HTTP-01校验方式签发证书

< ">如果使用HTTP-01的校验方式,需要用到Ingress来配合校验。cert-manager会通过自动修改Ingress规则或自动新增Ingress来实现对外暴露校验所需的临时HTTP路径,这个就是在给Issuer配置http01校验,指定Ingress的name或class的区别(见下面的示例)。

< ">TKE自带的Ingress是每个Ingress资源都会对应一个CLB,如果你使用TKE自带的Ingress暴露服务,并且使用HTTP-01方式校验,那么只能使用自动修改Ingress的方式,不能自动新增Ingress,因为自动新增出来的Ingress会自动创建其它CLB,对外的IP地址就与我们后端服务的Ingress不一致,Let's Encrypt校验时就无法从我们服务的Ingress找到校验所需的临时路径,从而导致校验失败,无法签发证书。如果使用自建Ingress,比如在TKE上部署Nginx Ingress,同一个Ingress class的Ingress共享同一个CLB,这样就可以使用自动新增Ingress的方式。

< ">下面给出一些示例。

< ">如果你的服务使用TKE自带的Ingress暴露服务,不太适合用cert-manager签发管理免费证书,因为证书是要上传到证书管理[7]来引用的,不在K8S中管理。

< ">假设是在TKE上部署Nginx Ingress,且后端服务的Ingress是prod/web,创建Issuer示例:

apiVersion: cert-manager.io/v1

kind: Issuer

metadata:

  name: letsencrypt-http01

  namespace: prod

spec:

  acme:

    server: https://acme-v02.api.letsencrypt.org/directory

    privateKeySecretRef:

      name: letsencrypt-http01-account-key

    solvers:

    - http01:

       ingress:

         name: web # 指定被自动修改的 Ingress 名称

< ">使用上面的Issuer签发证书,cert-manager会自动修改prod/web这个Ingress资源,以暴露校验所需的临时路径,这是自动修改Ingress的方式,你可以使用自动新增Ingress的方式,示例:

apiVersion: cert-manager.io/v1

kind: Issuer

metadata:

  name: letsencrypt-http01

  namespace: prod

spec:

  acme:

    server: https://acme-v02.api.letsencrypt.org/directory

    privateKeySecretRef:

      name: letsencrypt-http01-account-key

    solvers:

    - http01:

       ingress:

         class: nginx # 指定自动创建的 Ingress 的 ingress class

< ">使用上面的Issuer签发证书,cert-manager会自动创建Ingress资源,以暴露校验所需的临时路径。

< ">有了Issuer,接下来就可以创建Certificate并引用Issuer进行签发了,示例:

apiVersion: cert-manager.io/v1

kind: Certificate

metadata:

  name: test-mydomain-com

  namespace: prod

spec:

  dnsNames:

  - test.mydomain.com # 要签发证书的域名

  issuerRef:

    kind: Issuer

    name: letsencrypt-http01 # 引用 Issuer,指示采用 http01 方式进行校验

  secretName: test-mydomain-com-tls # 最终签发出来的证书会保存在这个 Secret 里面

DNS-01校验方式签发证书

< ">如果使用DNS-01的校验方式,就需要看你使用的哪个DNS提供商了,cert-manager内置了一些DNS提供商的支持,详细列表和用法请参考Supported DNS01 providers[8],不过cert-manager不可能去支持所有的DNS提供商,如果没有你所使用的DNS提供商怎么办呢?有两种方案:

< ">方案一:设置Custom Nameserver。在你的DNS提供商后台设置custom nameserver,指向像cloudflare这种可以管理其它DNS提供商域名的nameserver地址,具体地址可登录cloudflare后台查看:

< ">下面是namecheap设置custom nameserver的示例:



< ">最后配置Issuer指定DNS-01验证时,加上cloudflare的一些信息即可(见下文示例)。

< ">方案二:使用Webhook。使用cert-manager的Webhook来扩展cert-manager的DNS-01验证所支持的DNS提供商,已经有许多第三方实现,包括国内常用的DNSPod与阿里DNS,详细列表参考:Webhook[9]。

< ">下面以cloudflare为例来签发证书:

< ">1.登录cloudflare,点到My Profile>API Tokens>Create Token来创建Token:

< ">复制Token并妥善保管:

< ">将Token保存到Secret中:

apiVersion: v1

kind: Secret

metadata:

  name: cloudflare-api-token-secret

  namespace: cert-manager

type: Opaque

stringData:

  api-token: <API Token> # 粘贴 Token 到这里,不需要 base64 加密。

< ">如果是要创建ClusterIssuer,Secret需要创建在cert-manager所在命名空间中,如果是Issuer,那就创建在Issuer所在命名空间中。

< ">创建ClusterIssuer:

apiVersion: cert-manager.io/v1

kind: ClusterIssuer

metadata:

  name: letsencrypt-dns01

spec:

  acme:

    privateKeySecretRef:

      name: letsencrypt-dns01

    server: https://acme-v02.api.letsencrypt.org/directory

    solvers:

    - dns01:

        cloudflare:

          email: my-cloudflare-acc@example.com # 替换成你的 cloudflare 邮箱账号,API Token 方式认证非必需,API Keys 认证是必需

          apiTokenSecretRef:

            key: api-token

            name: cloudflare-api-token-secret # 引用保存 cloudflare 认证信息的 Secret

< ">创建Certificate:

apiVersion: cert-manager.io/v1

kind: Certificate

metadata:

  name: test-mydomain-com

  namespace: default

spec:

  dnsNames:

  - test.mydomain.com # 要签发证书的域名

  issuerRef:

    kind: ClusterIssuer

    name: letsencrypt-dns01 # 引用 ClusterIssuer,指示采用 dns01 方式进行校验

  secretName: test-mydomain-com-tls # 最终签发出来的证书会保存在这个 Secret 里面

获取和使用证书

< ">创建好Certificate后,等一小会儿,我们可以kubectl查看是否签发成功:

$ kubectl get certificate -n prod

NAME    &发布一条新闻nbsp;                     READY           SECRET                             AGE

test-mydomain-com   True               test-mydomain-com-tls   1m

< ">如果READY为False表示失败,可以通过describe查看event来排查失败原因:

$kubectl describe certificate test-mydomain-com-n prod

< ">如果为True表示签发成功,证书就保存在我们所指定的Secret中(上面的例子是default/test-mydomain-com-tls),可以通过kubectl查看:

$ kubectl get secret test-mydomain-com-tls -n default

...

data:

  tls.crt: <cert>

  tls.key: <private key>

< ">其中tls.crt就是证书,tls.key是密钥。

< ">你可以将它们挂载到你需要证书的应用中,或者使用自建的Ingress,可以直接在Ingress中引用secret,示例:

apiVersion: networking.k8s.io/v1beta1

kind: Ingress

metadata:



  name: test-ingress

  annotations:

    kubernetes.io/Ingress.class: nginx

spec:

  rules:

  - host: test.mydomain.com

    http:

      paths:

      - path: /web

        backend:

          serviceName: web

          servicePort: 80

  tls:

    hosts:

    - test.mydomain.com

    secretName: test-mydomain-com-tls

小结

< ">本文介绍了cert-manager的工作原理,安装方法以及签发免费证书的两种校验方式(HTTP-01与DNS-01)的原理、对比以及操作方法。

参考资料

[1]cert-manager:https://cert-manager.io/

[2]ACME:https://tools.ietf.org/html/rfc8555X

[3]Let's Encrypt:https://letsencrypt.org/

[4]Let's Encrypt的运作方式:https://letsencrypt.org/zh-cn/how-it-works/

[5]Webhook:https://cert-manager.io/docs/concepts/webhook/

[6]Installing with regular manifests:https://cert-manager.io/docs/installation/kubernetes/#installing-with-regular-manifests

[7]证书管理:https://console.cloud.tencent.com/ssl

[8]Supported DNS01 providers:https://cert-manager.io/docs/configuration/acme/dns01/#supported-dns01-providers

[9]Webhook:https://ce辟谣的危机公关rt-manager.io/docs/configuration/acme/dns01/#webhook

[10]Iss电商运营检查uer API文档:https://cert-manager.io/docs/reference/api-docs/#cert-manager.io/v1.Issuer

[11]Certificate API文档:https://cert-manager.io/docs/reference/api-docs/#cert-manager.io/v1.Certificate

腾讯云手把手教你使用cert-manager签发免费证书

上一篇:INS广告知多少
下一篇:Instagram怎么玩呢?


版权声明:以上主题为“腾讯云手把手教你使用cert-manager签发免费证书"的内容可能是本站网友自行发布,或者来至于网络。如有侵权欢迎联系我们客服QQ处理,谢谢。
相关内容
推荐内容
扫码咨询
    腾讯云手把手教你使用cert-manager签发免费证书
    打开微信扫码或长按识别二维码

小提示:您应该对本页介绍的“腾讯云手把手教你使用cert-manager签发免费证书”相关内容感兴趣,若您有相关需求欢迎拨打我们的服务热线或留言咨询,我们尽快与您联系沟通腾讯云手把手教你使用cert-manager签发免费证书的相关事宜。

关键词:腾讯云手把手教你使用c

关于 | 业务 | 案例 | 免责 | 隐私
客服邮箱:sales@1330.com.cn
电话:400-021-1330 | 客服QQ:865612759
沪ICP备12034177号 | 沪公网安备31010702002418号