nginx 配置免费的 Let’s Encrypt SSL/TLS 证书
1 下载 Let’s Encrypt 客户端
首先,下载 Let’s Encrypt 客户端 certbot。
如上所述,我们在 Ubuntu 16.04 上测试了相关指令,以下是在该平台上运行的相应命令:
```
$ apt-get update
$ sudo apt-get install certbot
$ apt-get install python-certbot-nginx
```
用 Ubuntu 18.04和更高版本, 替代 Python 3版本:
```
$ apt-get update
$ sudo apt-get install certbot
$ apt-get install python3-certbot-nginx
```
2 设置 NGINX
certbot 可以自动完成 NGINX 的 SSL/TLS 配置。它会在您的 NGINX 配置中查找并修改包含 server_name 指令(含有您为其请求证书的域名)的 server 块。在我们的示例中,域名为 www.example.com.
假设您在一个全新的 NGINX 安装上进行设置,请使用文本编辑器在 /etc/nginx/conf.d 目录中创建一个名为 domain‑name.conf 的文件(在我们的示例中为 www.example.com.conf)。
使用 server_name 指令指定您的域名(如果域名有变体的话也请指定):
```
server {
listen 80 default_server;
listen [::]:80 default_server;
root /var/www/html;
server_name example.com www.example.com;
}
```
保存文件,然后运行以下命令来验证配置的语法并重新启动 NGINX:
```
$ nginx -t && nginx -s reload
```
3 获取 SSL/TLS 证书
certbot 的 NGINX 插件负责重新配置 NGINX,并在必要时重新加载其配置。
运行以下命令,使用 NGINX 插件生成证书:
```
$ sudo certbot --nginx -d example.com -d www.example.com
```
根据 certbot 的提示配置 HTTPS 设置,包括输入您的电子邮件地址并同意 Let’s Encrypt 服务条款。
证书生成后,NGINX 重新加载新设置。certbot 生成一条消息,显示证书成功生成,并指示证书在服务器上的位置。
Congratulations! You have successfully enabled https://example.com and https://www.example.com
-------------------------------------------------------------------------------------
IMPORTANT NOTES:
Congratulations! Your certificate and chain have been saved at:
/etc/letsencrypt/live/example.com/fullchain.pem
Your key file has been saved at:
/etc/letsencrypt/live/example.com//privkey.pem
Your cert will expire on 2017-12-12.
注:Let’s Encrypt 证书在 90 天后到期(在本例中,到期时间为 2017 年 12 月 12 日)。有关自动更新证书的信息,请参阅下方“自动更新 Let’s Encrypt 证书”一节。
如果查看 domain‑name.conf,您会发现 certbot 已对其进行了修改:
```
server {
listen 80 default_server;
listen [::]:80 default_server;
root /var/www/html;
server_name example.com www.example.com;
listen 443 ssl; # managed by Certbot
# RSA certificate
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
# Redirect non-https traffic to https
if ($scheme != "https") {
return 301 https://$host$request_uri;
} # managed by Certbot
}
```
4 自动更新 Let’s Encrypt 证书
Let’s Encrypt 证书将在 90 天后到期。我们建议您自动更新证书。此处,我们将一个 cron 作业添加到现有 crontab 文件中,以执行这一操作。
打开 crontab 文件。
```
$ crontab -e
```
添加 certbot 命令,并设置为每天运行。在本例中,我们每天中午运行该命令。该命令检查服务器上的证书是否会在未来 30 天内到期,如果是,则更新证书。--quiet 指令告知 certbot 不要生成输出。
```
0 12 * * * /usr/bin/certbot renew --quiet
```
保存并关闭文件。所有已安装的证书将自动更新和重新加载。