在之前的文章中有对Let’s Encrypt进行介绍,这个开源项目提供的Free SSL Cert非常适合在小型站点上进行部署。部署过程稍微复杂但是十分可靠。
美中不足的是,Let’s Encrypt提供的SSL证书有效期仅为90天,也就是说,为了确保证书不过期,使用者尽量得在60天内就对证书有效期进行更新操作。
所谓的更新,最简单的方法就是重新生成,但重新生成证书会有两个问题:
- 生成证书时会占用80端口,也就是说在生成证书期间,网站将无法访问。
- 手动升级证书过程虽然简单,但能够自动化的操作最好还是机器执行比较容易。
看了许多国内的关于自动续期脚本的文章,大多是拿来主义,直接使用别人封装好的脚本。诚然这十分方便,但其实自己编写一个自动续期脚本也并不困难。在DO上有篇文章详细的说明了这个过程(文章链接),可供参考。这里放出我自己的版本。
自动更新命令配置
这里使用Let’s Encrypt自带的Webroot插件完成证书更新。使用这个插件的好处在于,它在执行更新操作的时候创建了一个虚拟的环境用于更新证书,这就避免了80端口的占用。于是乎,不关闭网站完成证书更新便成为了可能。
首先,需要将Webroot插件的工作目录加入到Nginx的server字段中,使得Let’s Encrypt的服务能够访问到这个目录以用来validate。
在”在Nginx上部署Let‘s Encrypt证书“一文中,有Nginx服务器配置,这里需要在443端口的server字段中加入下面几行:
location ~ /.well-known { allow all; }
以上修改的文件为
/etc/nginx/sites-enabled/zivers.com
在我的Nginx配置文件中,网站root目录为
/var/www/zivers.com/
执行更新操作时,需要选定这个目录运行脚本。
下面执行更新操作
cd /usr/letsencrypt ./letsencrypt-auto certonly -a webroot --agree-tos --renew-by-default --webroot-path=/var/www/zivers.com -d zivers.com -d www.zivers.com
请将上述命令中的路径和域名改为自己的。
重载Nginx生效
service nginx reload
上述命令似乎有点复杂,下面我们将上面的命令配置化。首先复制Let’s Encrypt的样例cli文件
cp /usr/letsencrypt/examples/cli.ini /etc/letsencrypt/auto-renew.ini vi auto-renew.ini
去除以下字段前的注释并对配置文件进行修改:
rsa-key-size = 4096 email = admin@zivers.com domains = zivers.com, www.zivers.com webroot-path = /var/www/zivers.com/
现在,你可以用配置化的命令执行更新操作
cd /usr/letsencrypt ./letsencrypt-auto certonly -a webroot --renew-by-default --config /etc/letsencrypt/auto-renew.ini
创建自动更新脚本
于是我们可以创建一个脚本来自动执行上述操作
cd /usr/shell/ vi letencrypt-auto-renew.sh
样例脚本如下:
#!/bin/bash cd /usr/letsencrypt ./letsencrypt-auto certonly -a webroot --renew-by-default --config /etc/letsencrypt/auto-renew.ini service nginx reload
赋予执行权限
chmod +x letencrypt-auto-renew.sh
加入crontab自动执行
crontab -e 0 0 1 * * /usr/shell/letsencrypt-auto-renew.sh