如何在GCP中将DigiCert SSL证书添加到Kubernetes Secrets?
DigiCert证书部署到GKE供Ingress使用操作流程
1. 提前校验与证书文件准备
- 先确认私钥和域名证书匹配,避免后续无效操作:
执行以下两条命令,对比输出的MD5值,完全一致才是匹配的,不匹配就联系DigiCert重新下发对应文件openssl x509 -noout -modulus -in {domain-name.crt} | openssl md5 openssl rsa -noout -modulus -in privatekey.pem | openssl md5 - 拼接完整证书链,K8s TLS Secret要求证书文件包含完整信任链,不然部分客户端会报证书不可信。严格按域名证书→中间CA证书→根证书的顺序拼接,顺序不能乱:
cat {domain-name.crt} DigiCertca.crt Trustedroot.crt > fullchain.pem - 检查私钥是否带密码:如果执行上面的openssl rsa命令时提示输入密码,说明私钥是加密的,先执行下面的命令导出无密码版本,不然Ingress控制器无法读取:
openssl rsa -in privatekey.pem -out decrypted-privatekey.pem # 后续创建Secret时用解密后的decrypted-privatekey.pem替换privatekey.pem即可
2. 连接目标GKE集群并创建TLS Secret
- 先把本地kubectl上下文切到要部署的GKE集群,替换命令里的占位参数为实际的GCP资源信息:
gcloud container clusters get-credentials <你的GKE集群名称> --zone <集群所在可用区> --project <GCP项目ID> - 创建标准TLS类型的Secret,必须和后续要引用它的Ingress在同一个K8s命名空间,新手不要尝试跨命名空间引用,会触发权限问题:
kubectl create secret tls digicert-prod-ssl --cert=fullchain.pem --key=privatekey.pem -n <Ingress所在的命名空间> - 校验Secret创建结果:执行下面的命令,看到输出里包含
tls.crt、tls.key两个base64编码的字段就说明创建成功kubectl get secret digicert-prod-ssl -n <对应命名空间> -o yaml
3. 配置Ingress引用Secret
不管用GKE自带的GCE Ingress(对接谷歌云负载均衡)还是自行部署的Nginx Ingress,都可以用标准的TLS配置块引用刚才创建的Secret,参考配置如下:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: prod-service-ingress namespace: <和Secret相同的命名空间> annotations: # 根据你用的Ingress控制器放开对应注解,二选一 # kubernetes.io/ingress.class: "gce" # 用GCE原生Ingress时放开 # kubernetes.io/ingress.class: "nginx" # 用Nginx Ingress时放开 spec: tls: - hosts: - <你的业务域名,比如example.com、www.example.com> secretName: digicert-prod-ssl # 这里填刚才创建的Secret名称,不要拼错 rules: - host: <你的业务域名> http: paths: - path: / pathType: Prefix backend: service: name: <后端业务Service名称> port: number: <后端Service暴露的端口>
把上面的占位符替换成实际信息后,用kubectl apply -f 你的ingress配置文件名.yaml提交即可。
常见踩坑说明
- 证书链顺序拼反会导致部分老版本浏览器、移动端设备报证书不信任,拼接时严格按域名证书在前、中间证书居中、根证书在后的顺序
- GCE原生Ingress配置生效需要5-10分钟,因为谷歌云负载均衡要同步下发证书和转发规则,刚apply完访问报错不用急,等几分钟再测
- 排查问题直接看Ingress事件:
kubectl describe ingress prod-service-ingress -n <命名空间>,证书加载失败、后端不通这类问题都会在事件里直接报原因 - 验证生效可以用
curl -vI https://你的业务域名,看返回的证书链路是否完整,有没有SSL校验相关的报错即可
内容的提问来源于stack exchange,提问作者Jae
相关产品推荐
相关产品推荐

