Ubuntu 16.04 配置 Let's Encrypt 实现站点 SSL

Let's Encrypt 是国外一个公共的免费 SSL 项目,由 Linux 基金会托管,它的来头不小,由 Mozilla、思科、Akamai、IdenTrust 和 EFF 等组织发起,目的就是向网站自动签发和管理免费证书,以便加速互联网由 HTTP 过渡到 HTTPS,目前 Facebook 等大公司开始加入赞助行列。
Let's Encrypt 已经得了 IdenTrust 的交叉签名,这意味着其证书现在已经可以被 Mozilla、Google、Microsoft 和 Apple 等主流的浏览器所信任,你只需要在 Web 服务器证书链中配置交叉签名,浏览器客户端会自动处理好其它的一切,Let's Encrypt 安装简单,未来大规模采用可能性非常大。

像是 iOS、微信小程序等开发都要求网络请求使用 HTTPS 加密传输。不购买 SSL 证书的话,这是一个不错的选择。本文是介绍使用 Nginx 作为站点服务时的配置过程。

安装 Certbot

Certbot 是用来维护 Let's Encrypt 的 Package,使用它部署证书极其方便。

添加该 package repository

sudo add-apt-repository ppa:certbot/certbot

更新 apt 源数据

sudo apt-get update

安装 Certbot 的 Nginx package

sudo apt-get install python-certbot-nginx

签发 SSL 证书

sudo certbot --nginx -d your-domian.com -d www.your-domain.com

这里的 your-domain.com 换成你自己的域名。

将会出现需要输入你的邮箱地址,还有接受 Let's Encrypt 的协议,按提示操作。最后将会出现

Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access.
-------------------------------------------------------------------------------
1: No redirect - Make no further changes to the webserver configuration.
2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for
new sites, or if you're confident your site works on HTTPS. You can undo this
change by editing your web server's configuration.
-------------------------------------------------------------------------------
Select the appropriate number [1-2] then [enter] (press 'c' to cancel):

根据提示,我选择了 2,会将 nginx 对应的配置文件写入 http 跳转到 https 的规则。如以下是本站的配置文件被添加的规则:

listen 443 ssl; # managed by Certbot

ssl_certificate /etc/letsencrypt/live/kaixuan.im/fullchain.pem; # managed by Certbot

ssl_certificate_key /etc/letsencrypt/live/kaixuan.im/privkey.pem; # managed 
by Certbot

include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot

ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

if ($scheme != "https") {
    return 301 https://$host$request_uri;
} # managed by Certbot

# Redirect non-https traffic to https
# if ($scheme != "https") {
#     return 301 https://$host$request_uri;
# } # managed by Certbot

到此,安装过程没有出现什么错误的话,站点已经可以用 https 访问了。

自动更新证书

Let's Encrypt 签发的 SSL 证书有效期只有 90 天,在过期之前,需要自动更新 SSL 证书,我们使用 certbot 的话,Let's Encrypt 会添加自动更新的脚本到 /etc/cron.d 里,我们可以模拟一下证书更新

sudo certbot renew --dry-run

如没出错,模拟成功更新提示如下:

** DRY RUN: simulating 'certbot renew' close to cert expiry
**          (The test certificates below have not been saved.)

Congratulations, all renewals succeeded. The following certs have been renewed:
  /etc/letsencrypt/live/kaixuan.im/fullchain.pem (success)
** DRY RUN: simulating 'certbot renew' close to cert expiry
**          (The test certificates above have not been saved.)

最后用 crontab 写个计划任务,定期运行命令来更新证书。

sudo crontab -e

加入以下计划

15 2 * */2 * certbot renew --post-hook "service nginx restart"

每隔两个月的凌晨 2:15 执行更新操作。--post-hook 这个参数表示更新操作完要执行的命令,这里就重启 nginx。

上个本站成功使用 SSL 的截图。

Snip20171112_3