标签归档:Let’s Encrypt

Let’s Encrypt自动续期脚本(更新)

2017-06-06 更新


最新版本的Let’s Encrypt已经可以通过命令自动更新了,只需执行一条Renew命令即可。具体命令参照 Certbot官网,选择实际的操作系统版本和服务器版本即可找到。

以下是原文(2016-5-25)内容


Let’s Encrypt自动续期脚本这篇文章中,我给出了一个Let’s Encrypt的自动续期脚本。随着Let’s Encrypt项目走出测试阶段进入正式服务阶段,脚本代码也发生了变化。按照原来的脚本执行时,虽然还是能够完成续期操作,但是官方给出了一个警告信息:

20160525182433

内容是说之前的letsencrypt-auto这个脚本已经过期了,并不推荐使用。现在是使用一个叫做certbot-auto的脚本来实现。于是我打开官网的说明文档,果然也已经改成了certbot方式,详见官网Get Start文档。那这里也给出更新方法。

首先去下载新的程序代码:

cd /usr
git clone https://github.com/certbot/certbot
cd /usr/certbot

在这个目录下我们可以看见一个certbot-auto文件,我们将用它替换letsencrypt-auto。

修改之前的自动更新脚本(之前的脚本请移步此文: Let’s Encrypt自动续期脚本)

cd /usr/shell
vi letsencrypt-auto-renew.sh

修改成如下:

#!/bin/bash
cd /usr/certbot
./certbot-auto certonly -a webroot --renew-by-default --config /etc/letsencrypt/auto-renew.ini
service nginx reload

执行这个脚本,如果正常运行则修改成功

root@localhost:/usr/shell# ./letsencrypt-auto-renew.sh 
Checking for new version...
Requesting root privileges to run certbot...
   /root/.local/share/letsencrypt/bin/letsencrypt certonly -a webroot --renew-by-default --config /etc/letsencrypt/auto-renew.ini

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at
   /etc/letsencrypt/live/zivers.com-0001/fullchain.pem. Your cert will
   expire on 2016-08-23. To obtain a new version of the certificate in
   the future, simply run Certbot again.
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

 * Reloading nginx configuration nginx                                                                      [ OK ]

Let’s Encrypt自动续期脚本

在之前的文章中有对Let’s Encrypt进行介绍,这个开源项目提供的Free SSL Cert非常适合在小型站点上进行部署。部署过程稍微复杂但是十分可靠。

美中不足的是,Let’s Encrypt提供的SSL证书有效期仅为90天,也就是说,为了确保证书不过期,使用者尽量得在60天内就对证书有效期进行更新操作。

所谓的更新,最简单的方法就是重新生成,但重新生成证书会有两个问题:

  1. 生成证书时会占用80端口,也就是说在生成证书期间,网站将无法访问。
  2. 手动升级证书过程虽然简单,但能够自动化的操作最好还是机器执行比较容易。

看了许多国内的关于自动续期脚本的文章,大多是拿来主义,直接使用别人封装好的脚本。诚然这十分方便,但其实自己编写一个自动续期脚本也并不困难。在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

在Nginx上部署Let’s Encrypt证书

Let’s Encrypt is a free, automated, and open certificate authority (CA), run for the public’s benefit. Let’s Encrypt is a service provided by the Internet Security Research Group (ISRG).

下面是我在Nginx服务器上部署它提供的SSL证书的过程:

  • 安装git
apt-get update
apt-get install git
  • 下载安装Let’s Encrypt源码,在etc目录下部署代码
cd /usr/
git clone https://github.com/letsencrypt/letsencrypt letsencrypt
  • SSL证书部署时需要关闭Nginx服务器。
service nginx stop
netstat -na | grep ':80.*LISTEN'
# return null if nginx has stopped
  • 生成SSL证书
cd /usr/letsencrypt
./letsencrypt-auto certonly --standalone
  • 之后将初始化简单的图形界面以安装SSL证书,需要填写域名信息
zivers.com www.zivers.com
  • 看到一下文字时说明证书生成成功
IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at
   /etc/letsencrypt/live/zivers.com/fullchain.pem. Your cert will
   expire on 2016-04-22. To obtain a new version of the certificate in
   the future, simply run Let's Encrypt again.
 - If you like Let's Encrypt, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le
  • 从以上信息中,可以看见,证书被存储到了以下目录
/etc/letsencrypt/live/zivers.com/
#证书路径
/etc/letsencrypt/live/zivers.com/fullchain.pem
  • 修改Nginx配置

加入ssl证书信息,并写入rewrite规则

server {
        listen 80;
        server_name zivers.com;
        rewrite ^/(.*)$ https://www.zivers.com/$1 permanent;
}
server {
        listen 80;
        server_name www.zivers.com;
        rewrite ^/(.*)$ https://www.zivers.com/$1 permanent;
}

server {
        listen 443 ssl;
        server_name zivers.com;

        ssl_certificate /etc/letsencrypt/live/zivers.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/zivers.com/privkey.pem;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;
        ssl_ciphers AES256+EECDH:AES256+EDH:!aNULL;
        rewrite ^/(.*)$ https://www.zivers.com/$1 permanent;
}

server {
        listen 443 ssl;
        ssl_certificate /etc/letsencrypt/live/zivers.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/zivers.com/privkey.pem;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;
        ssl_ciphers AES256+EECDH:AES256+EDH:!aNULL;
        root /var/www/zivers.com;
        index index.php;

        server_name www.zivers.com;
        ...
}

Let’s Encrypt SSL证书试用

Let’s Encrypt (进入官网) 是一个开放的CA项目,旨在让每个网站都能使用HTTPS加密,该项目获得了思科、Mozilla、Akamai、IdenTrust和EFF等组织的支持,由Linux基金会托管。

Let’s Encrypt is a free, automated, and open certificate authority (CA), run for the public’s benefit. Let’s Encrypt is a service provided by the Internet Security Research Group (ISRG).

The key principles behind Let’s Encrypt are:

  • Free: Anyone who owns a domain name can use Let’s Encrypt to obtain a trusted certificate at zero cost.
  • Automatic: Software running on a web server can interact with Let’s Encrypt to painlessly obtain a certificate, securely configure it for use, and automatically take care of renewal.
  • Secure: Let’s Encrypt will serve as a platform for advancing TLS security best practices, both on the CA side and by helping site operators properly secure their servers.
  • Transparent: All certificates issued or revoked will be publicly recorded and available for anyone to inspect.
  • Open: The automatic issuance and renewal protocol will be published as an open standard that others can adopt.
  • Cooperative: Much like the underlying Internet protocols themselves, Let’s Encrypt is a joint effort to benefit the community, beyond the control of any one organization.

从15年初我便开始观察这个项目的进展,终于在11月,Let’s Encrypt颁发了第一张证书。从12月起,Let’s Encrypt开始了公测。我也在第一时间试用了这个所谓的免费SSL证书。

安装并不复杂,从GitHub上拉取项目代码,在本地生成SSL的Private Key,在Nginx中加入对443端口的监听,并加入ssl key即可。具体安装过程在Let’s Encrypt的官方Docs中有详细的介绍(Doc: https://letsencrypt.readthedocs.org/en/latest/index.html)。对于WordPress,还需要稍微修改下后台的链接,在设置中将链接修改成https方式即可使用。

总的来说,Let‘s Encrypt的部署过程十分容易且操作友好,有简单的图形界面(符号拼图),可以说在功能上已经较为完整。生成的证书也可以被主流浏览器识别,在一些无需要求太高的网站上已经十分适用。但是生成的SSL证书有效期只有三个月,需要每三个月重新生成一次,所以增加了维护成本。当然,写个脚本每三个月自动生成一次自然是更加聪明的做法。