GCP批量配置托管证书解决方案

作者:MeshCloud脉时云公有云架构师 许多杰

引言

Google 管理的 SSL 证书是 Google Cloud 为客户的网域获取和管理的网域验证 (DV) 证书。支持每个证书有多个主机名,Google 会自动续订证书。

客户在使用托管证书的过程中,有在LB上批量申请和绑定托管证书的需求。例如在同一个LB绑定多个IP地址的场景下,这些IP地址需要对应不同的域名和证书进行一一绑定。而创建证书和绑定证书的过程客户手动操作起来比较繁琐,需要批量处理。出于该需求的考虑,我们提出以下解决方案。

整体架构

全球外部 HTTP(S) 负载均衡器组件

GCP批量配置托管证书解决方案

批量配置托管证书方案架构

GCP批量配置托管证书解决方案

技术简介

通过编写脚本的方式完成批量申请托管证书和批量绑定的任务:使用gcloud命令行工具,依次完成申请托管证书、创建目标HTTPS代理、查询ip地址名称,最后通过创建全局转发规则来实现绑定。

文件列表准备

客户准备资源列表 lb.txt,每行内容分别为静态ip、域名、lb名称。

1.1.1.1  www.example01.com  my_lb_01
2.2.2.2  www.example02.com  my_lb_02
3.3.3.3  www.example03.com  my_lb_03

批量申请托管证书

  1. 编写shell脚本

# vim get_cert.sh

#!/bin/bash

# 读取 lb.txt 文件
while read line; do
  # 使用空格分割字符串
  arr=($line)
  # 选择第二列作为 domain
  domain=${arr[1]}
  certificate_name=`echo $domain | sed "s/./-/g"`

  # 批量申请托管证书
  gcloud compute ssl-certificates create $certificate_name'-certificate' 
    --description=$domain'-CERTIFICATE' 
    --domains=$domain 
    --global
   echo "${line} $certificate_name-certificate" >> output.txt

done < lb.txt
  1. 输出output.txt文件
# cat output.txt
1.1.1.1  www.example01.com  my_lb_01  www-example01-com-certificate
2.2.2.2  www.example02.com  my_lb_02  www-example02-com-certificate
3.3.3.3  www.example03.com  my_lb_03  www-example03-com-certificate

在输出文件output.txt文件中,在每一行结尾追加了申请到的SSL托管证书的名称,格式为域名中的点(.)转换为中划线(-),并在后边追加字符串-certificate。

批量绑定托管证书

  • 创建目标 HTTPS 代理,并创建一条全局转发规则,将传入请求路由到代理。
  •  # vim push_config.sh
#!/bin/bash

# 读取 output.txt 文件
while read line; do
  # 使用空格分割字符串
  arr=($line)
  # 选择第一列作为lb的ip地址
  lb_ip=${arr[0]}
  # 选择第二列作为 domain
  domain=${arr[1]}
  # 选择第三列作为lb名称
  url_map_name=${arr[2]}
  target_https_proxy_name=`echo $domain | sed 's/./-/g'`
  certificate_name=${arr[3]}

  # 创建目标 HTTPS 代理
  gcloud compute target-https-proxies create $target_https_proxy_name"-target-https-proxy" 
    --url-map=$url_map_name 
    --ssl-certificates=$certificate_name

  # 查询ip地址的名称
  ip_address_name=`gcloud compute addresses list --filter="ADDRESS=$lb_ip" | grep 'NAME' | awk -F': ' '{print$2}'`
  echo $ip_address
  forwarding_rule_name=`echo $domain | sed 's/./-/g'`
  # 创建全局转发规则
  gcloud compute forwarding-rules create $forwarding_rule_name"forwarding-rule" 
    --load-balancing-scheme=EXTERNAL 
    --network-tier=PREMIUM 
    --address=$ip_address_name 
    --global 
    --target-https-proxy=$target_https_proxy_name"-target-https-proxy" 
    --ports=443

done < output.txt

脚本执行效果

GCP批量配置托管证书解决方案
  1. get_cert.sh 脚本根据客户整理文件列表实现批量申请证书,如域名为 www.example.com,则申请的证书名称为:www-example-com-certificate
  2. push_config.sh 脚本根据上一步 get_cert.sh 脚本脚本执行生成的 output.txt,批量创建 target-https-proxy 和 forwarding-rule,即将证书和LB实现绑定。

补充资料

  • 使用到的 gcloud 相关命令
列出证书
gcloud compute ssl-certificates list | grep 'NAME'

删除证书
gcloud compute ssl-certificates delete ***


查看HTTPS 代理
gcloud compute target-https-proxies list

删除 HTTPS 代理
gcloud compute target-https-proxies delete ****


查看转发规则
gcloud compute forwarding-rules list

删除转发规则
gcloud compute forwarding-rules delete ***  --global

参考文档:

  1. 创建证书

https://cloud.google.com/load-balancing/docs/ssl-certificates/google-managed-certs?hl=zh-cn#create-ssl

  1. 更新Lb配置

https://cloud.google.com/load-balancing/docs/ssl-certificates/google-managed-certs?hl=zh-cn#load-balancer