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 ## 每周日凌晨 2 :30 自动更新证书 30 2 * * 0 /usr/bin/letsencrypt renew >> /var/log/le-renew.log#每周日凌晨 2 :40 重启nginx服务 40 2 * * 0 /bin/systemctl restart nginx
如果想要验证证书是否可以正常更新可以修改 /etc/letsencrypt/renewal/yourdomain.com.conf
,去掉 # renew_before_expiry = 30 days
前的 #
同时将 30
修改为一个可以正常更新证书的值,如 89
(验证后记得还原)。
证书申请频次限制
注册 IP 限制每 3 小时不超过 10 次
每个域名(包括子域名)每7天不超过 5 个
2018.03.13 Let’s Encrypt 支持通配符证书( Wildcard Certificates )
官方教程