作者:MeshCloud脉时云公有云架构师 许多杰
引言
Google 管理的 SSL 证书是 Google Cloud 为客户的网域获取和管理的网域验证 (DV) 证书。支持每个证书有多个主机名,Google 会自动续订证书。
客户在使用托管证书的过程中,有在LB上批量申请和绑定托管证书的需求。例如在同一个LB绑定多个IP地址的场景下,这些IP地址需要对应不同的域名和证书进行一一绑定。而创建证书和绑定证书的过程客户手动操作起来比较繁琐,需要批量处理。出于该需求的考虑,我们提出以下解决方案。
整体架构
全球外部 HTTP(S) 负载均衡器组件
批量配置托管证书方案架构
技术简介
通过编写脚本的方式完成批量申请托管证书和批量绑定的任务:使用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
批量申请托管证书
- 编写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
- 输出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
脚本执行效果
- get_cert.sh 脚本根据客户整理文件列表实现批量申请证书,如域名为 www.example.com,则申请的证书名称为:www-example-com-certificate
- 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
参考文档:
- 创建证书
- 更新Lb配置