自动化部署https证书、及通配符证书部署

阿里云上的免费https证书,从2024年初开始,从一年有效期变为了3个月,如下图:

1703751417294.png

虽然不支持通配符的证书,由于就那么几个。手动一年一更换,也能接受。

但现在改为了3个月,虽然let's encrypt也是3月一换,但是人家支持自动更新证书啊,而且还支持通配符证书啊,所以果断换let's encrypt的https证书。


整体思路:

  1. 安装certbot用来申请证书
  2. 给certbot添加自动化任务,定时自动检查更新
  3. 对通配符域名设置自动验证
  4. 对cdn自动同步更新证书。

 

本文环境:

debian + nginx + 主域名(rangotec.com) + 通配符域名(*.rangotec.com) + 七牛cdn.rangotec.com; 其中主域名使用本地自动验证所有权,通配符使用脚本来自动验证。

具体步骤:

1. 安装certbot

$ sudo apt install certbot python3-certbot-nginx

 2. 申请 cert; 这里使用certonly参数,因为我的配置文件由多个,nginx 配置文件有嵌套,所以需要手动配置。

$ sudo certbot certonly -a webroot -w /home/www/ -i nginx -v -d rangotec.com -d www.rangotec.com

-a webroot -w /home/www 的意思是使用本地验证方式来验证域名所有权。

也就是需要在目录 /home/www/  下创建 .well-known 路径来自动验证,同时nginx的配置文件放行 .well-known 路径。 如下:

# 修改nginx 站点配置 .wellkown
location ^~ /.well-known {
        allow all;
        root /home/www/;
 }

运行完 certbot 命令 会提示输入邮箱,成功后在 /etc/letsencrypt/live/ 目录下会生成对应域名证书文件。如下:

rt@rangotec.comr:~$ sudo ls -l /etc/letsencrypt/live/
total 12
drwxr-xr-x 2 root root 4096 Dec 21 12:53 rangotec.com
drwxr-xr-x 2 root root 4096 Dec 21 13:55 rangotec.com-0001
-rw-r--r-- 1 root root  740 Dec 21 12:53 README

其中 rangotec.com 为生成的主域名证书目录,然后修改Nginx的配置文件添加该目录下的证书:

# 修改配置文件,添加证书及参数
nginx{
 # .... 
        # Certbot
        ssl_certificate /etc/letsencrypt/live/rangotec.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/rangotec.com/privkey.pem;
        include /etc/letsencrypt/options-ssl-nginx.conf;
        ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;

# ....
}

然后重新加载配置文件,使之生效。

$ systemctl reload nginx

至此主域名自动证书配置完成了。

3.  通配符域名申请证书(示例: *.rangotec.om)

通配符域名只能通过dns记录的方式来验证,不能通过本地,所以需要下载脚本。

$ wget https://github.com/ywdblog/certbot-letencrypt-wildcardcertificates-alydns-au

本文解压到了 /home/my_cron.sh/certbot-letencrypt-wildcardcertificates-alydns-au-master/ 路径下。

我的系统使用的是python版本, 以及阿里云的DNS。按照说明,配置accesskey 和密码,阿里云的accesskey申请方式见下图 。

然后运行cerbot 申请通配符证书:

$ sudo certbot certonly  -d *.rangotec.com --manual --preferred-challenges dns --dry-run  --manual-auth-hook "/home/my_cron.sh/certbot-letencrypt-wildcardcertificates-alydns-au-master/au.sh python aly add" --manual-cleanup-hook "/home/my_cron.sh/certbot-letencrypt-wildcardcertificates-alydns-au-master/au.sh python aly clean"

第一次基本会出问题,所以使用--dry-run模拟运行下,无错误后去掉 --dry-run 参数真实运行。

成功运行后,生成的配置文件在  /etc/letsencrypt/live/rangotec.com-0001 目录下

rt@rangotec.comr:~$ sudo ls -l /etc/letsencrypt/live/
total 12
drwxr-xr-x 2 root root 4096 Dec 21 12:53 rangotec.com
drwxr-xr-x 2 root root 4096 Dec 21 13:55 rangotec.com-0001
-rw-r--r-- 1 root root  740 Dec 21 12:53 README

所以如果写错了参数,可以手动修改对的配置文件,配置文件所在目录如下:

rt@rangotec.com:~$ sudo ls /etc/letsencrypt/renewal
rangotec.com-0001.conf  rangotec.com.conf

至此 通配符域名自动配置证书完成。

4. 七牛cdn自动配置证书

首先创建certbot-qiniucdn.py 文件,该脚本用来更新七牛云的证书,内容如下

# -*- coding: utf-8 -*-
from qiniu import Auth
import os
import sys
import requests
import datetime

# cert_domain = 'cdn.rangotec.com'
# cert_domain_local = 'rangotec.com-0001'
cert_domain = '替换你的七牛云域名,参照上面的示例'
cert_domain_local = '替换证书的位置,参照上面的示例'
access_key = '替换你的key'
secret_key = '替换你的key'

print('CERT_DOMAIN: ' + cert_domain)
print('QINIU_ACCESS_KEY: ' + access_key)
print('QINIU_SECRET_KEY: ' + secret_key)

# 构建七牛鉴权对象
auth = Auth(access_key, secret_key)

# 上传证书
## 上传 api 地址
sslcertUploadUrl = 'http://api.qiniu.com/sslcert'
## 生成 上传证书 api accesstoken
sslcert_accesstoken = auth.token_of_request(sslcertUploadUrl)
print('上传证书 api accesstoken: ' + sslcert_accesstoken)

## 证书信息
sslcertFolder = '/etc/letsencrypt/live/rangotec.com-0001'
sslcertPriFile = open(sslcertFolder + '/privkey.pem')
sslcertChainFile = open(sslcertFolder + '/fullchain.pem')
sslcertPriStr = sslcertPriFile.read()
sslcertChainStr = sslcertChainFile.read()
nowDate = datetime.date.today().strftime("%Y%m%d")
sslcertData = {
    'name': cert_domain + '-letsencrypt-' + nowDate,
    'common_name': cert_domain,
    'pri': sslcertPriStr,
    'ca': sslcertChainStr
}
sslcertHeaders = {
    'Authorization': 'QBox ' + sslcert_accesstoken,
    'Content-Type': 'application/json'
}
print('证书JSON数据如下:')
print(sslcertData)
## 执行请求
sslcertUploadResponse = requests.post(sslcertUploadUrl, json=sslcertData, headers=sslcertHeaders).json()
print(sslcertUploadResponse)
certID = sslcertUploadResponse['certID']
if certID is None:
    print('证书上传失败!')
    sys.exit()

# 修改 cdn 证书
## 修改证书 api 地址
cdnHttpsconfUrl = 'http://api.qiniu.com/domain/{}/httpsconf'.format(cert_domain)
## 生成 cdn 修改证书 api accesstoken
cdn_httpsconf_accesstoken = auth.token_of_request(cdnHttpsconfUrl)
print('修改证书 api accesstoken: ' + cdn_httpsconf_accesstoken)
## 执行修改请求
httpsconfData = {
    'certId': certID,
    'forceHttps': False,
    'http2Enable': True
}
httpsconfHeaders = {
    'Authorization': 'QBox ' + cdn_httpsconf_accesstoken,
    'Content-Type': 'application/json'
}
httpsconfResponse = requests.put(cdnHttpsconfUrl, json=httpsconfData, headers=httpsconfHeaders).json()
print(httpsconfResponse)
print('修改七牛 CDN SSL 证书完成~')

 

然后修改au.sh脚本,再末尾添加上以下内容,意思是清理的时候,执行certbot-qiniucdn.py脚本更新七牛的cdn证书。

if [[ "$paction" == "clean" ]]; then

	# 激活python虚拟环境
        # 执行上传证书到七牛云 cdn 上
	source /home/my_cron.sh/python3_virtual_env/bin/activate
	python /home/my_cron.sh/certbot-qiniucdn.py

fi

5. certbot 自动化证书申请

// crontab 添加自动化任务

$ SLEEPTIME=$(awk 'BEGIN{srand(); print int(rand()*(3600+1))}'); echo "0 0,12 * * * root sleep $SLEEPTIME && certbot renew -q" | sudo tee -a /etc/crontab > /dev/null

上面是cerbot 官网的命令, 就是在/etc/crontab 里添加一条 每天12点自动申请的命令,并且随机延迟几百秒。

# 或者手动在crontab 里添加一行
0 0,12 * * * root certbot renew -q

 

测试验证:

// 模拟运行
# certbot renew --dry-run 

运行以上命令, 进行模拟验证, 一切完美自动运行的话会有成功的提示。 

 

至此完整流程记录完毕, 太长的命令输出信息,不再粘贴。

 

查看 视频教程

评论列表: