阿里云上的免费https证书,从2024年初开始,从一年有效期变为了3个月,如下图:
虽然不支持通配符的证书,由于就那么几个。手动一年一更换,也能接受。
但现在改为了3个月,虽然let's encrypt也是3月一换,但是人家支持自动更新证书啊,而且还支持通配符证书啊,所以果断换let's encrypt的https证书。
整体思路:
本文环境:
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
至此 通配符域名自动配置证书完成。
如果用了cdn服务器那继续第4步,如果没用cdn,直接本机,那就跳转到第5步。
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 证书完成~')
2024-4-20日更改钩子的位置:
修改/etc/letsencrypt/renewal/rangotec.com-0001.conf文件,再末尾添加上以下内容,意思是证书更新后,执行certbot-qiniucdn.py脚本更新七牛的cdn证书。
# .... 其他略 ...
post_hook = /home/my_cron.sh/certbot-qiniucdn.sh #脚本内容见下方
# .... 其他略 ...
#----------------------------
certbot-qiniucdn.sh 脚本内容如下(多了个激活多python环境的步骤):
#!/bin/bash
LANG="zh_CN.UTF-8"
# 执行上传证书到七牛云 cdn 上
source /home/my_cron.sh/python3_virtual_env/bin/activate
python /home/my_cron.sh/certbot-qiniucdn.py
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
运行以上命令, 进行模拟验证, 一切完美自动运行的话会有成功的提示。
至此完整流程记录完毕, 太长的命令输出信息,不再粘贴。
查看 视频教程