Let’s Encrypt 是一个于 2015 年第三季度推出的数字证书颁发机构,旨在以自动化流程为广大网站提供免费的SLL证书。Let’s Encrypt 已经得到了电子前哨基金会、Mozilla 基金会、Akamai、Chrome 以及思科等众多公司的支持。

由于商业 SSL 证书申请价格不菲,且没有自动化更新工具。Let’s Encrypt 申请不但免费而且简单方便;虽然 Let’s Encrypt 申请的证书只有 90天 的有效期,但是可以通过定时脚本定期更新证书一劳永逸。

CentOS 7 安装 certbot

因为 certbot 在 EPLE (Extra Packages for Enterprise Linux) 中不在官方软件仓库中,所以需要先安装 eple-release

1
2
3
4
5
6
7
8
# 安装epel-release
# yum install epel-release

# 更新yum缓存
# yum makecache

# 安装基于nginx的certbot
# sudo yum install certbot-nginx

安装 Let’s Encrypt的nginx 插件

1
2
3
4
5
6
7
8
9
10
11
12
13
# sudo certbot --authenticator webroot --installer nginx
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator webroot, Installer nginx
Starting new HTTPS connection (1): acme-v01.api.letsencrypt.org

Which names would you like to activate HTTPS for?
-------------------------------------------------------------------------------
1: domain.com
2: your.domain.com
3: www.domain.com
-------------------------------------------------------------------------------
Select the appropriate numbers separated by commas and/or spaces, or leave input
blank to select all options shown (Enter 'c' to cancel):

选择要配置证书的域名,如果域名所有域名指向同一个 web 目录,可以忽略直接回车。

如果安装 Let’s encrypt 证书过程中遇到 .well-known 403 forbidden nginx,需要将 nginx 网站根目录下的 .well-known 隐藏目录设置成允许访问。

1
2
3
location ~ ^/.well-known {
root /your/webroot;
}

重新执行上面命令,如果一切正常会显示如下信息:

1
2
3
- Congratulations! Your certificate and chain have been saved at
/etc/letsencrypt/live/your.domain/fullchain.pem
...

证书位置

所有版本申请的证书都在 /etc/letsencrypt/archive 里面,/etc/letsencrypt/live 是指向最新证书版本的符号链接。

Nginx SSL 配置

1
2
3
4
5
6
listen				443 ssl;
server_name your.domain.com;
ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;

重启 Nginx 服务即生效。

强制 HTTPS

nginx 默认监听的是80端口,使用的 http 协议,https 监听443端口;如果需要全站都通过 https 访问,则可以将 http 强制跳转至https,通过如下 nginx 配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
server {
listen 80;
listen 443 ssl;
server_name your.domain.com;

ssl_certificate /etc/letsencrypt/live/your.domain/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/your.domain/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;

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

证书自动更新

Let’s Encrypt 颁发的证书只有 90天 的有效期,手动更新费时费力而且容易遗忘;所以,可以通过计划任务实现 SSL 证书的自动更新。

1
2
3
4
5
## 每周日凌晨 230 自动更新证书
30 2 * * 0 /usr/bin/letsencrypt renew >> /var/log/le-renew.log

#每周日凌晨 240 重启nginx服务
40 2 * * 0 /bin/systemctl restart nginx

如果想要验证证书是否可以正常更新可以修改 /etc/letsencrypt/renewal/yourdomain.com.conf,去掉 # renew_before_expiry = 30 days前的 # 同时将 30 修改为一个可以正常更新证书的值,如 89(验证后记得还原)。

证书申请频次限制

  1. 注册 IP 限制每 3 小时不超过 10 次
  2. 每个域名(包括子域名)每7天不超过 5 个
  3. 2018.03.13 Let’s Encrypt 支持通配符证书( Wildcard Certificates )

官方教程