欢迎访问我的博客,你的支持,是我最大的动力!

NginX启用http2-使用dehydrated自动更新Lets Encrypt证书

Linux 马从东 201℃ 评论
目录:
[显示]

Let's Encrypt提供免费的SSL证书,证书有效期为90天,到期前需要进行更新

Let's Encrypt官方推广的证书管理工具是 Certbot 这是用python写的一套程序,可申请和更新证书,但该工具部署过程中需要安装大量依赖组件,对系统侵入性比较大,特别是在用于生产环境时,会引入复制度,个人并不推荐

dehydrated 则是一个shell脚本,依赖于curl、sed、grep、awk、mktemp、openssl,这些依赖在linux系统中往往会默认安装,可以认为没有依赖,是一个非常干净、非常轻量的证书申请和管理工具,对系统几乎没有侵入。dehydrated提供http-01、dns-01、tls-alpn-01三种方式,其中http-01方式最方便,但不能申请泛域名证书。(使用dns-01时,由于需要动态修改dns记录,TXT record,而shell脚本本身并不能完成该项操作,通常需要配合lexicon,[pip install dns-lexicon],需要使用example/hook.sh 将dehydrated的hook命令转给lexicon使用)

官网:https://dehydrated.io/
项目地址:https://github.com/lukas2511/dehydrated
下载文件:https://github.com/lukas2511/dehydrated/archive/master.zip

部署

# 下载文件
mkdir -p /etc/dehydrated
cd /etc/dehydrated/
curl -LO https://raw.githubusercontent.com/lukas2511/dehydrated/master/dehydrated
chmod +x dehydrated
# 配置文件
curl -LO https://raw.githubusercontent.com/lukas2511/dehydrated/master/docs/examples/config
echo "pdf.us www.pdf.us" > /etc/dehydrated/domains.txt
# 若一行配置多个域名 仅会生成一个证书 (SAN证书) 这种证书haproxy也是支持的 (不必一个域名生成一个证书了)
# 编辑配置文件
vi config
编辑如下内容:
第64行 WELLKNOWN="/var/www/dehydrated"   #生成验证文件的路径
第106行 CONTACT_EMAIL="admin@pdf.us"        #联系人邮箱
# wellknown目录
mkdir -p /var/www/dehydrated
# 编辑nginx配置文件 添加
vi /opt/web_engine/nginx/conf/conf.d/pdf.us.web.conf

systemctl reload nginx
# 测试
echo "hello world" > /var/www/dehydrated/index.html
http://pdf.us/.well-known/acme-challenge/index.html
# 申请证书
## 主机注册,第一次操作需要执行,会生成/etc/dehydrated/accounts目录 存储帐户信息
./dehydrated --register --accept-terms
# INFO: Using main config file /etc/dehydrated/config
+ Generating account key...
+ Registering account key with ACME server...
+ Done!
# 申请证书
/etc/dehydrated/dehydrated -c
# INFO: Using main config file /etc/dehydrated/config
+ Creating chain cache directory /etc/dehydrated/chains
Processing pdf.us with alternative names: www.pdf.us
+ Creating new directory /etc/dehydrated/certs/pdf.us ...
+ Signing domains...
+ Generating private key...
+ Generating signing request...
+ Requesting new certificate order from CA...
+ Received 2 authorizations URLs from the CA
+ Handling authorization for pdf.us
+ Handling authorization for www.pdf.us
+ 2 pending challenge(s)
+ Deploying challenge tokens...
+ Responding to challenge for pdf.us authorization...
+ Challenge is valid!
+ Responding to challenge for www.pdf.us authorization...
+ Challenge is valid!
+ Cleaning challenge tokens...
+ Requesting certificate...
+ Checking certificate...
+ Done!
+ Creating fullchain.pem...
+ Done!
# 申请的证书位于 /etc/dehydrated/certs/pdf.us 目录下
# 软链接 cert.csr cert.pem chain.pem fullchain.pem privkey.pem

# 开启防火墙开放443端口
firewall-cmd --permanent --zone=public --add-service=https
firewall-cmd --reload

可以访问了:https://pdf.us

自动更新

添加定时任务
crontab -e
#0 0 * * * root sleep $(expr $(printf "\%d" "0x$(hostname | md5sum | cut -c 1-8)") \% 86400); ( /etc/dehydrated/dehydrated -c; /usr/sbin/service nginx reload ) > /var/log/pdf.us.log 2>&1
15 1 8,15,26 * * root sleep 23;( /etc/dehydrated/dehydrated -c; /usr/sbin/service nginx reload; date ) >> /var/log/pdf.us.log 2>&1

说明:
$(expr $(printf "%d" "0x$(hostname | md5sum | cut -c 1-8)") % 86400)
生成一个主机特定的随机数,目的在于防止所有主机都在同一时间访问Let's Encrypt,对服务器形成类似DDoS的压力
反斜杠\%是因为在crontab中,%会截断命令,必须转义

不依赖domains.txt,可这样写
/etc/dehydrated/dehydrated -c -d your.domain

生成Haproxy可用的证书

cat fullchain.pem privkey.pem > $SITE.pem  即需合并fullchain及privkey文件
# 建议使用 多域名证书SAN 或 泛域名证书

dehydrated 命令

Nginx参数

nginx.conf

pdf.us.web.conf

附:
部署脚本,供参考

 

转载请注明:轻风博客 » NginX启用http2-使用dehydrated自动更新Lets Encrypt证书

喜欢 (0)or分享 (0)