Nginx + CertBot 泛解析域名申请https证书以及利用脚本完成证书自动续期

功能需求

阿里云linux centos7服务器, 原单一项目现整合了部分功能到公司主体大项目中, 该大项目已使用https, 故需要将此单一项目升级, 由于一直写代码, 做这种配置的经验少, 且涉及到泛解析问题, 与此前常用配置些许不同

说明

本文所有操作都是针对单一机器, 如果是集群方案,暂时没有涉及到故不做解法;

参考

  • nginx配置

对于使用有限数量子域名的情况等情况, 网站中使用配置部分的Cerbot配置可以完全适用
https://www.digitalocean.com/community/tools/nginx?global.app.lang=zhCN

  • Certbot

主要参考renewal部分, 由于证书90天自动过期, 需检查或配置自动续期策略
https://eff-certbot.readthedocs.io/en/stable/using.html#setting-up-automated-renewal

操作

下载组件

Nginx看具体情况, 本次实例是此前根据digitalocean直接配置后下载安装

certbot-auto 也一样操作

#是否sudo看用户, 本次实例未使用certbot-auto 以及 snap的方式下载
yum -y install epel-release
yum -y install certbot

建议看看certbot -h, 没几个选项, 解释也很清楚

certbot 域名配置

命令中对应参数可以根据情况修改

单一域名

# 主要参数:
# --webroot 方式只适用于指定域名的情况, --manuel 手动方式,适用于泛解析的情况, 例如 a.xx.com b.xx.com ....等更多可能的域名
# 参数说明: 
# -w 配合 --webroot出现,定义certbot根据请求生成验证文件的目录
certbot certonly --webroot -d *.domain.com --email xx@xx.com -w /var/www/_letsencrypt -n --agree-tos --force-renewal

注意点

digitalocean里下载的配置文件中有包含这段配置的文件

# 当使用--webroot方式时,需要在server块中优先增加一个路由
# ACME-challenge
location ^~ /.well-known/acme-challenge/ {
    root /var/www/_letsencrypt;
}

本例:泛解析(人工配置 DNS TXT方式)

#本次案例使用 manuel方式申请证书, 指定challenges为 dns-01方式, 只有此方式能完成泛解析,否则chrome等浏览器会报请求不安全
#若非要使用第一种方式,可以在chrome或edge页面中输入thisisunsafe加载页面,不推荐
certbot certonly --manual -d *.domain.com --email xx@xx.com  --preferred-challenges dns-01 --force-renewal
--server https://acme-v02.api.letsencrypt.org/directory

上述命令返回提示后等待DNS配置生效后回车完成配置,切勿在未配置相应的DNS TXT记录的情况下下一步

#terminal中说明:
# 需要先配置 DNS TXT 
# 具体为一个 _acme-challenge.domain.com 的文件中填入以下内容xxxxx
Please deploy a DNS TXT record under the name
-acme-challenge.domain.com with the following value:

xxxxxxxxxxxxx

Before continuing, verify the record is deployed.

根据提示内容配置DNS TXT,切勿在未配置相应的DNS TXT记录的情况下下一步

#新开一个session
#本例是阿里云服务器, 后台直接可以修改配置,不多赘述
#使用以下命令检查配置是否生效
dig  -t txt  _acme-challenge.domain.com @8.8.8.8
#返回中包含对应配置部分则说明配置生效,下文600为配置的ttl,视情况而定

#;; ANSWER SECTION:
#_acme-challenge.domain.com. 600 IN	TXT	"xxxxxxxxxxxx"

配置成功后回车, 几秒后会提示证书的位置: 本例为: /etc/letsencrypt/live/domain.com/xxxx.pem
可以使用certbot delete --cert-name domain.com删除此前配置的证书

本例:泛解析域名(脚本方式)

该脚本项目可以在续期时使用

yum install git
git clone https://github.com/ywdblog/certbot-letencrypt-wildcardcertificates-alydns-au
cd certbot-letencrypt-wildcardcertificates-alydns-au && chmod 0777 au.sh

#一定查看readme 

vim au.sh
#填写服务器 accesskey 和 sercet

#保存后测试, 服务器有php环境用php, 有python环境用python, 替换命令中关键字即可
#au.sh三个参数: 执行脚本的环境:php/python | 云服务器:aly/hwy/txy等 | 对应--manual-xx-hook参数 固定的 add/clean
certbot certonly -d *.xxxxx.com --manual --preferred-challenges dns --dry-run  --manual-auth-hook "/脚本目录/au.sh php aly add" --manual-cleanup-hook "/脚本目录/au.sh php aly clean"

#测试无误,去除--dry-run再次执行,获取证书
certbot certonly -d *.xxxxx.com --manual --preferred-challenges dns --manual-auth-hook "/脚本目录/au.sh php aly add" --manual-cleanup-hook "/脚本目录/au.sh php aly clean"

证书续期

记录: 2022-06-15

对于单一域名的证书而言, 使用 certbot renew 命令就可以自动完成续期, 但对于泛解析域名, 在使用该命令续期时提示手动脚本是缺少的,这里就是个坑了, 因为使用人工配置DNS TXT的方式申请泛域名证书, 在续期时certbot无法完成人工的那个部分导致续期失败; 但certbot提供了脚本来调用服务商接口更新DNS TXT信息, 但官方的脚本都是针对国外服务器厂商的, 国内需要使用

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

中的脚本来操作,理论都是一样的, 记得star哦, 目前支持阿里云,腾讯云,华为云,godaddy

此方式只能对单一域名证书做到自动续期

#certbot 续期命令可能已经自动添加到系统的定时任务里了, 可以检查相应位置
crontab -l
/etc/cron.*/* 
systemctl list-timers

#本次实例中未自动添加,手动增加一个定时任务即可
#脚本
#说明 --renew-hook 执行脚本, 至于执行什么完全自定义
certbot renew --force-renewal --renew-hook "openresty -s reload" > /xxxxxx/ssl-renew/ssl-update.log 2>&1 &
#其中cron表达式自己随意定义
crontab -e
#自行添加

泛解析域名的自动续期

#有git忽略此步骤
yum install -y git
#获取项目
git clone https://github.com/ywdblog/certbot-letencrypt-wildcardcertificates-alydns-au
cd certbot-letencrypt-wildcardcertificates-alydns-au
#提供了php脚本和python脚本
#查看项目中的README,基本上就已经解释的很清楚了,这里只是简述一下
chmod 0777 au.sh

编辑一下脚本填写配置

vim au.sh
#填写阿里云的AccessKey ID及AccessKey Secret
#如何申请见https://help.aliyun.com/knowledge_detail/38738.html
ALY_KEY=""
ALY_TOKEN=""
#填写腾讯云的SecretId及SecretKey
#如何申请见https://console.cloud.tencent.com/cam/capi
TXY_KEY=""
TXY_TOKEN=""
#填写华为云的 Access Key Id 及 Secret Access Key
#如何申请见https://support.huaweicloud.com/devg-apisign/api-sign-provide.html
HWY_KEY=""
HWY_TOKEN=""
#PHP 命令行路径,如果有需要可以修改
phpcmd="/usr/bin/php"
#Python 命令行路径,如果有需要可以修改
pythoncmd="/usr/bin/python"

测试
续期时需要使用--manual-clean-hook清除信息, --manual-auth-hook配置信息
au.sh 三个参数: [php/python] [aly/hwy等] [对应hook为 add/clean]

#建议看看 certbot -h
# --dry-run参数在申请和续期时都可以用,等于 “测试”
#因为服务器上有php环境,所以参数填写php
./certbot renew --dry-run --manual --preferred-challenges dns --manual-auth-hook "/脚本全路径/au.sh php aly add" --manual-cleanup-hook "/脚本全路径/au.sh php aly clean"
#如果使用python环境,则把 php 替换为 python 即可

#最后将输出
Congratulations, all simulated renewals succeeded: 
  /etc/letsencrypt/live/xxxxxx/fullchain.pem (success)
#也就续期成功了

实际续期
全部证书

./certbot renew --manual --preferred-challenges dns --manual-auth-hook "/脚本全路径/au.sh php aly add" --manual-cleanup-hook "/脚本全路径/au.sh php aly clean"

指定证书

certbot certificates #查看所有证书
	#Found the following certs:
  	#Certificate Name: 证书名称
    #Serial Number: xxxxxxx
    #Key Type: RSA
    #Domains: *.xxxx.com
    #Expiry Date: 2022-09-29 01:23:03+00:00 (VALID: 89 days)
    #Certificate Path: /etc/letsencrypt/live/xxxx/fullchain.pem
    #Private Key Path: /etc/letsencrypt/live/xxxx/privkey.pem
certbot renew --cert-name [证书名称]  --manual-auth-hook "/脚本全路径/au.sh php aly add" --manual-cleanup-hook "/脚本全路径/au.sh php aly clean"

crontab
个人建议把续期的命令写在一个脚本里, 在用crontab一个表达式调用

#renew.sh里就是上面的certbot renew那些东西了
crontab -e
0 0 1,15 * * root /xxxx/ssl-renew/renew.sh > /dev/null 2>&1 &

Nginx配置

可以完全复制于 digitalocean.com 中的全局以及域名server块中的配置,完全适用

#http全局模块
http {

....

    # SSL
    ssl_session_timeout    1d;
    ssl_session_cache      shared:SSL:10m;
    ssl_session_tickets    off;

    # Diffie-Hellman parameter for DHE ciphersuites
    ssl_dhparam            /etc/nginx/dhparam.pem;

    # Mozilla Intermediate configuration
    ssl_protocols          TLSv1.2 TLSv1.3;
    ssl_ciphers            ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;

    # OCSP Stapling
    ssl_stapling           on;
    ssl_stapling_verify    on;
    resolver               1.1.1.1 1.0.0.1 8.8.8.8 8.8.4.4 208.67.222.222 208.67.220.220 valid=60s;
    resolver_timeout       2s;
 
 ....
 
 }
#域名配置
server {
 	# SSL
    ssl_certificate         	/etc/letsencrypt/live/domain.com/fullchain.pem;
    ssl_certificate_key    	 	/etc/letsencrypt/live/domain.com/privkey.pem;
    ssl_trusted_certificate 	/etc/letsencrypt/live/domain.com/chain.pem;
}
#本例是openresty
openresty -t
openresty -s reload
  • 0
    点赞
  • 1
    收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:游动-白 设计师:我叫白小胖 返回首页
评论

打赏作者

Grandpa_Rick

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值