certbot生成证书,配置nginx,利用脚本自动续期
踩了大量坑,做下记录。以下适用于博主本人,但是未必会适用于所有人
单域名与泛域名证书生成
sudo certbot certonly --standalone --email '邮箱' -d '域名'
# 单域名
certbot certonly --preferred-challenges dns --manual -d *.baidu.com(修改这里) --server https://acme-v02.api.letsencrypt.org/directory
# 泛域名 手动模式
certbot certonly --dns-cloudflare --dns-cloudflare-credentials /etc/letsencrypt/cloudflare.ini -d *.baidu.com(修改这里)
# 泛域名 自动 不想手动配置DNS用这个,配置看下面的续费脚本部分
nginx配置SSL
server {
listen 80;
server_name 对应的域名;
return 301 https://$server_name$request_uri; #强制ssl
location / {
#项目地址+端口,可以本地,也可以外地
proxy_pass http://localhost:8080;
}
}
# 443 ssl
server {
listen 443 ssl;
server_name 对应的域名;
#更改下方的证书路径
ssl_certificate /etc/letsencrypt/live/baidu.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/baidu.com/privkey.pem;
ssl_session_cache shared:SSL:10m; #这里可能要与其他的保持一致?
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
#项目地址+端口,可以本地,也可以外地
proxy_pass http://localhost:8080;
}
}
自动续期脚本
在生成泛域名证书时,我们需要手动在DNS解析中配置TXT,然而续费命令renew
无法去完成我们手动配置TXT的过程,需要我们手动配置,所以会报错。
我们需要用到一个DNS插件,这样我们就不需要配置TXT了,可以直接生成证书或者续费,也可以尝试把下面命令中的厂商改成你的厂商。
DNS-plugins
在上面链接中找到自己的服务商,我用的是cloudflare。注意:如果是国内的厂商,去GitHub上找脚本。
snap install certbot-dns-cloudflare # 我用这个没有用,我用的下面的pip安装方法
pip install certbot
pip install certbot-dns-cloudflare #注意pip与python环境的对应
这个地方遇到了问题,很久才解决,因为我是双python环境,但是排除很久不知道哪里冲突了,干脆直接删了python3,在重新安装pip,让他变成python2的pip
certbot plugins #查看安装的插件
API Key在“My Profile”–>“API Tokens”
# 创建配置文件
touch /etc/letsencrypt/cloudflare.ini
# 修改配置文件
vim /etc/letsencrypt/cloudflare.ini
# 添加如下内容,别忘记修改
# Cloudflare API credentials used by Certbot
dns_cloudflare_email = cloudflare@example.com
dns_cloudflare_api_key = 0123456789abcdef0123456789abcdef01234567
# 修改文件权限
chmod 600 /etc/letsencrypt/cloudflare.ini
接下来可以执行生成证书或者续费证书的操作了
修改续费配置文件(手动生成的证书才需要修改)
如果我们使用的是手动配置的泛解析,那么我们无法直接执行renew,即使已经配置了DNS插件。
进入 /etc/letsencrypt/renewal 目录,找到续费配置文件,找到如下配置:
可以看到,配置文件是手动方式,我们需要手动改成DNS方式(如果前面用的是DNS自动方式生成的证书,就没有这方面烦恼了)
按照如下的配置进行修改:
# Options used in the renewal process
[renewalparams]
authenticator = dns-cloudflare
account = 71e9f9688487336cb4851b7174d327c6
dns_cloudflare_credentials = /etc/letsencrypt/cloudflare.ini
server = https://acme-v02.api.letsencrypt.org/directory
如果不想修改配置,也可以重新执行上面的安装证书第三条配置命令。
certbot renew #证书续期
certbot renew --force-renewal #强制更新 无视30天
--pre-hook:更新证书之前调用
--post-hook:更新证书之后调用
--deploy-hook:成功更新证书之后调用
# 创建一个shell脚本,内容如下:
certbot renew --deploy-hook "nginx -s reload"
chmod +x certrenew.sh # 赋予执行权限
# 编写cron定时任务
crontab -e
# 输入如下内容
0 0 1 * * /shell/certrenew.sh >> /shell/certrenew.log 2>&1
# 重启服务器
service crond restart
# 查看任务
crontab -l
无需续期
其他报错
[Errno 17] 错误
尝试运行 certbot update_symlinks