更新

  • 2019/01/16 修复 crontab 执行错误
  • 2017/02/19 初次发布

介绍

网站部署 HTTPS 后可以防止被劫持、中间人攻击等问题,对用户的安全很重要。现在各大网站都已开启全站 HTTPS,连淘宝、京东这种对 CDN 依赖极大的网站都已转换 HTTPS。

Let’s Encrypt 是一个于 2015 年三季度推出的数字证书认证机构,将通过旨在消除当前手动创建和安装证书的复杂过程的自动化流程,为安全网站提供免费的SSL/TLS证书。 来自 Let’s Encrypt - 维基百科,自由的百科全书

可以说现在使用 HTTPS 最大的证书问题也不再是问题了。

环境

  • CentOS 7.2
  • Nginx 1.10.2

安装

首先安装 EPEL 仓库与 certbot

1
2
sudo yum install epel-release
sudo yum install certbot

配置

获得证书时可以使用 certbot 的 webroot 插件来避免停止服务。

1
certbot certonly --webroot -w /path/to/your-site -d your-domain

这样就可以了,使用 https://your-domain 即可访问。

跳转

建议增加 HTTP 跳转到 HTTPS 的配置。在 nginx 网站的配置文件中增加以下内容即可:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
server {
    listen          80;
    server_name     your-domain;

    return          301 https://your-domain$request_uri;
}
server {
    listen          80;
    server_name     www.your-domain;
    return          301 https://your-domain$request_uri;
}

自动续期

因为 Let’s Encrypt 证书默认只有 3 个月有效期,官方建议使用自动续期。

编辑 crontab

1
sudo crontab -e

添加以下任务文本:

1
0 1,13 * * * . /etc/profile; sleep $((RANDOM\%3600)); certbot renew --quiet --post-hook "systemctl reload nginx"

注意:

  1. 最后的 systemctl reload nginx,只有执行这句后 nginx 才会加载新的证书。
  2. . /etc/profile 用来引入环境变量,否则执行时会提示 The nginx plugin is not working,参考 ./path/to/certbot-auto –nginx · Issue #4937 · certbot/certbot

参考资料