时间: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 |
上一篇:INS广告知多少
下一篇:Instagram怎么玩呢?
基于对传统行业渠道的理解,对互联网行业的渠道我们可以下这样一个定义:一切...
小米应用商店的后台操作和苹果是比较相似的,因为都能填写100字符关键词,允许...
小米的规则目前是在变更中的,但是根据经验小米的搜索排名评分的高低是个很重...
为了恰饭,有时候是要接入一些广告的,所以FB也专门有一个广告的SDK,这就是A...
在 2018 年于旧金山举行的游戏开发者大会上,Amazon Web Services (AWS) 曾宣布,目前世...
关于Facebook Audience Network如何收款的问题,其实官方已经给了详细的步骤。本文主要...
本文介绍了Audience Network对广告载体的质量检查,以及它重点广告形式需要注意的问...
随着iOS开发,作为开发者或公司需要针对iOS App开发涉及的方方面面作出对应的信息...
Facebook和谷歌对出海企业广告渠道都很熟悉,但事实上,在国外还有一些渠道也很...
卖家从做号的第1分钟开始,就一定要想好变现路径是什么?一定要以变现为目的去...
小提示:您应该对本页介绍的“腾讯云手把手教你使用cert-manager签发免费证书”相关内容感兴趣,若您有相关需求欢迎拨打我们的服务热线或留言咨询,我们尽快与您联系沟通腾讯云手把手教你使用cert-manager签发免费证书的相关事宜。
关键词:腾讯云手把手教你使用c