随着HTTPS不断普及,大多数网站开始由HTTP升级到HTTPS。使用HTTPS需要向权威机构申请CA证书,并且需要付出一定的成本,如果需求数量多,则开支也相对增加。证书过期,是个让人很头疼的问题。需要定期的去renew证书,就会比较麻烦,而且很容易遗忘。Cert-manager是Kubernetes上的全能证书管理工具,支持利用Cert-Manager基于ACME(AutomaticCertificateManagementEnvironment)协议与Let'sEncrypt签发免费证书并为证书自动续期,实现永久免费使用证书。
Cert-Manager官方给出的架构图,可以看到Cert-Manager在K8S中定义了两个自定义类型资源:Issuer和Certificate。
其中Issuer代表的是证书颁发者,可以定义各种提供者的证书颁发者,当前支持基于、Let'sEncrypt/vault和自签名等证书颁发者,还可以定义不同环境下的证书颁发者。
Certificate代表的是生成证书的信息数据,一般其中存入生成证书的元信息,如域名等等。
一旦在K8S中定义了上述两类资源,部署的Cert-Manager则会根据Issuer和Certificate生成TLS证书,并将证书保存进K8S的Secret资源中,然后在Ingress资源中就可以引用到这些生成的Secret资源。对于已经生成的证书,还会定期检查证书的有效期,如即将超过有效期,还会自动续期。
Let'sEncrypt和ACME协议的目标是使配置能够自动获取受信任浏览器的证书的HTTPS服务器成为可能。这是通过在Web服务器上运行证书管理软件(Agent)来达成的。该流程分为两步。首先,管理软件向证书颁发机构证明该服务器拥有域名的控制权。之后,该管理软件就可以申请、续期或吊销该域名的证书。
Let'sEncrypt通过公钥识别服务器管理员。证书管理软件首次与Let'sEncrypt交互时,会生成新的密钥对,并向Let'sEncryptCA证明服务器控制着一个或多个域名。这类似于创建帐户和向该帐户添加域名的传统证书颁发流程。
Let'sEncrypt利用ACME协议校验域名的归属,校验成功后可以自动颁发免费证书。免费证书有效期只有90天,需在到期前再校验一次实现续期。使用Cert-Manager可以自动续期,即实现永久使用免费证书。
本文将通过在OCI云上,在Kubernetes环境中,使用Cert-Manager和Let’sEncrypt自动管理应用证书的创建和更新的过程。
环境准备:
使用OCI部署好的OKE实例。
使用申请好的testoci.xyz域名,托管在OCIDNS服务上。
运行命令:
使用helm工具,安装Cert-Manager-WebhookforOCI,webhook使Cert-Manager的Issuer对象可以使用DNS校验机制,验证OCIDNS域名资源。
运行命令:
helminstallcert-manager-webhook-ocicert-manager-webhook-oci/cert-manager-webhook-oci
运行命令,确保Secret创建完成。
kubectlapply-foci-profile.yaml
创建名称为letsencrypt-ocidns的Issuer配置文件中,server的URL指向Let'sEncrypt的ACMEtls证书管理地址,如果是在测试环境中,可以指向staging测试的tls证书管理地址。Let'sEncrypt将使用DNS的校验方式,通过oci的webhook完成DNS域名的校验,ociProfileSecretName变量指向创建的oci-profileSecret,CompartmentOCID指向OCIDNS上托管的域名的Compartment。
kubectlapply-flet-encrypt-issuer-ocidns.yaml
查看Issuerletsencrypt的Ready状态为True,Issuer创建成功。
配置文件中dnsNames指定域名,通过dns校验方式,可以使用通配符域名,secretName指向Kubernetes中存放tls证书的Secret名称,IssuerRef指向创建的Iusser。
kubectlapply-fcertificate-let-encrypt-ocidns.yaml
查看Certificate的状态,Ready为True表示证书签发成功,可以使用。
在OKE集群中,使用NginxIngressControler对外暴露Web应用,NgnixIngressControler的部署过程参加官方文档。
在Ingress配置文件中,hosts指向OCIDNS配置的域名hello-ingress.testoci.xyz,secretName指向Certificate生成的secretapp-lets-encrept-oci-dns-tls。
通过命令,查看NginxIngressController的PublicIP地址为132.226.239.140。
在OCIDNS上,在testoci.xyz域名管理下,增加A记录指向NginxIngressController的PublicIP地址。
在浏览器通过域名访问发布的Web应用,发现Let'sEncrypt签发的证书已经应用,网站加上的“安全锁”的标记,表明网站的连接是安全的。
通过以上操作,在OCI的OKE环境中,可以看到通过Cert-Manager和Let‘sEncrypt,可以自动管理管理Kubernetes环境中CA证书的自动分发和管理工作。