编辑注:介绍使用Let’s Encrypt与NGINX的原始操作流程(发布于2016年2月)的博客文章现已重定向至此。该文章中的说明已弃用。
本文已更新,不再依赖 certbot‑auto。电子前沿基金会(EFF)已在Certbot 1.10.0中针对Debian和Ubuntu弃用该工具,并在Certbot 1.11.0中针对所有其他操作系统弃用该工具。有关更多详细信息和其他安装方法,请参阅这篇EFF发布的文章。
另请参阅我们在nginx.conf 2015期间发布的博客文章,其中电子前沿基金会的Peter Eckersley和Yan Zhu介绍了当时新成立的Let’s Encrypt证书颁发机构。
众所周知,为网站启用SSL/TLS加密有助于提升搜索排名,并增强用户安全性。然而,网站所有者在采用SSL时仍面临诸多障碍。
其中两大障碍是获取证书所需的成本和手动流程。但现在,有了Let’s Encrypt,这些问题已无需担忧。Let’s Encrypt让所有人都能免费使用SSL/TLS加密。
Let’s Encrypt是一个免费、自动化且开放的证书颁发机构(CA)。没错,SSL/TLS证书可免费获取。目前,大多数浏览器都信任Let’s Encrypt颁发的证书,包括Windows XP SP3上的Internet Explorer等旧版浏览器。此外,Let’s Encrypt还可实现证书颁发和续期的全流程自动化。
本文将介绍如何使用 Let’s Encrypt 客户端生成证书,以及如何自动配置 NGINX Open Source 和 NGINX Plus 以使用这些证书。
Let’s Encrypt 的工作原理
在颁发证书之前,Let’s Encrypt会验证域名所有权。运行在主机上的Let’s Encrypt客户端会创建一个包含所需信息的临时文件(令牌)。随后,Let’s Encrypt验证服务器会发出HTTP请求以获取该文件并验证令牌,从而确认域名的DNS记录解析到运行Let’s Encrypt客户端的服务器。
先决条件
开始使用 Let’s Encrypt 之前,需要:
- 已安装NGINX或NGINX Plus。
- 拥有或控制证书所对应的注册域名。如果没有注册域名,可以使用域名注册商,例如GoDaddy或dnsexit。
- 创建一条DNS记录,将域名与服务器的公共IP地址关联。
现在,您可以轻松地为NGINX Open Source或NGINX Plus设置Let’s Encrypt(为便于阅读,下文将其简称为NGINX)。
注意:我们已在Ubuntu 16.04(Xenial)上测试了本博文中所述的操作步骤。
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-nginx2. 设置NGINX
certbot可以自动为NGINX配置SSL/TLS。它会在NGINX配置中查找并修改相应的server块,该块包含一条server_name指令,其中指定了要申请证书的域名。在本例中,该域名为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 reload3. 获取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- 保存并关闭文件。所有已安装的证书都将自动续期并重新加载。
总结
我们已安装Let’s Encrypt代理,为已注册的域名生成SSL/TLS证书。我们已将NGINX配置为使用这些证书,并设置证书自动续期。借助适用于NGINX和NGINX Plus的Let’s Encrypt证书,只需几分钟即可启动并运行一个简单、安全的网站。
要亲自体验如何将Let’s Encrypt与NGINX Plus结合使用,立即开始30天免费试用,或联系我们,讨论您的使用场景。
相关文档
保护发往上游服务器的HTTP流量
保护发往上游服务器的TCP流量
NGINX SSL终止
关于作者
相关博客文章
NGINX Plus R26 正式发布
NGINX Plus R26通过缓存JSON Web密钥集加快JWT验证,并强化TLS握手,从而提升安全性。NGINX JavaScript的新功能包括增强对异步函数的支持,以及实现WebCrypto API。
使用NGINX App Protect DoS保护gRPC应用,抵御严重的DoS攻击
gRPC具备开发人员设计和部署现代应用所需的速度与灵活性,但其开放性也使其极易受到第7层DoS攻击。NGINX App Protect DoS可保护gRPC应用免受此类破坏性攻击。
Ingress Controller 选型指南(第 2 部分):风险与面向未来的规划
了解选择错误的Ingress控制器可能带来的风险,以及如何从关键方面着手,让您的选择更好地适应未来需求。
NGINX Plus R19 正式发布
NGINX Plus R19扩展了监控功能,不仅提供更多指标,还新增了指标分析方式;增加试运行模式,用于测试限速效果;增强键值存储,以支持IP地址范围;并使限速更加动态。
NGINX现已正式加入F5
NGINX现已正式成为F5的一部分。Gus Robertson现任F5 NGINX业务部门负责人。他阐述了两家公司在人才、文化和愿景方面融合的价值,以及双方将如何携手增强NGINX的开源产品和商业产品。

