有了 Let’s Encrypt,配置 SSL 证书再也不是难事,只是 Let’s Encrypt 目前还处在很初期的阶段,对 nginx 的自动化配置支持的还不好。不过我们完全可以自己写点小脚本来半自动化配置我们自己的 nginx 服务器。
我使用的脚本在这里,分享给大家。
这些脚本能做到什么
- 只需一行命令即为所有指向这台服务器上的 nginx 的域名申请 SSL 证书
- 用 Crontab 任务来自动续签证书
- 简单的 nginx 配置示例。可以重定向所有 www 开头的域名到不带 www 的域名上,还可以为你拿到一个 A+ 的 SSL Labs 评分。
安装
我把 Let’s Encrypt 作为一个 submodule 集成到这个项目里了。所以只需要克隆这一个项目就够了。
git clone https://github.com/songchenwen/nginx-ssl-config-with-letsencrypt.git
cd nginx-ssl-config-with-letsencrypt
git submodule init
git submodule update --remote
使用
申请证书
编辑 ssl/config
填写上你的域名。可以填写多个域名,第一个域名会被用作 Common Name。 证书会保存在 /etc/letsencrypt/live/
下,以 Common Name 命名的目录下。
选择一个 Let’s Encrypt 服务器。acme-v01
开头的服务器是正式服务器,有严格的请求次数限制,不建议拿它来做实验。acme-staging
开头的服务器是测试服务器,没有请求次数限制,但不会签出有效的证书,建议先用这个服务器来测试配置。
配置 nginx
Let’s Encrypt 在申请和续签证书时,需要用一个 http 服务器来放一个文件,这样它才能验证你对这个域名的所有权。
我这里用一个简单的 nginx 配置文件 letsencrypt_challenge
来重定向所有指向这台服务器的域名的 http 请求到对应的 https 请求上,只留下 Let’s Encrypt 验证所需的 URL 保留在 http 上。
sudo cp nginx-config/letsencrypt_challenge /etc/nginx/sites-available/letsencrypt_challenge
sudo ln -s /etc/nginx/sites-available/letsencrypt_challenge /etc/nginx/sites-enabled/letsencrypt_challenge
sudo nginx -s reload
执行脚本
执行 ssl/apply_all_certs.sh
,依照提示填入你的 email,然后你的证书就申请好了。
bash ssl/apply_all_certs.sh
sudo nginx -s reload
nginx 配置文件示例
在 nginx-config
目录下,有 3 个比较有用的 nginx 配置文件。使用之前记得要修改它们,至少要记得把我的域名替换成你的。
letsencrypt_challenge
重定向所有指向这台服务器的域名的 http 请求到对应的 https 请求上,只留下 Let’s Encrypt 验证所需的 URL 保留在 http 上。www_to_none_www
重定向所有 www 开头的域名的 https 请求到对应的没有 www 开头的域名上。sample_config
是一个简单的服务器配置文件。这个配置文件可以帮你轻松拿到 SSL Labs 上 A 的分数。把最后一个}
前的那一行配置取消注释就会开启 HSTS,这样你的评分就会变成 A+。
自动续签证书的 Crontab 任务
Let’s Encrypt 签发的证书只有 90 天的有效期,所以我们需要一个自动续签证书的方法。一个每个月续签一次的 Crontab 任务就足够了。这个任务应该以 root 权限执行,因为续签完之后我们还需要重载一下 nginx 的配置才能生效。
sudo crontab -e
下面是 Crontab 任务的内容
0 2 1 1-12 * /path/to/ssl/renew_all_certs.sh