更新:在NGINX中使用免费的Let’s Encrypt SSL/TLS证书

NGINX | 2021年1月28日

编辑注:介绍使用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-nginx

2. 设置NGINX

certbot可以自动为NGINX配置SSL/TLS。它会在NGINX配置中查找并修改相应的server块,该块包含一条server_name指令,其中指定了要申请证书的域名。在本例中,该域名为www.example.com。

  1. 假设您使用的是全新安装的NGINX,请使用文本编辑器在/etc/nginx/conf.d目录中创建一个名为domain‑name.conf的文件(在本例中为www.example.com.conf)。
  2. 使用server_name指令指定域名(以及变体,如有):
server {    listen 80 default_server;
    listen [::]:80 default_server;
    root /var/www/html;
    server_name example.com www.example.com;
}
  1. 保存文件,然后运行以下命令,验证配置语法并重启NGINX:
$ nginx -t && nginx -s reload

3. 获取SSL/TLS证书

适用于certbot的NGINX插件会在必要时自动重新配置NGINX并重新加载其配置。

  1. 运行以下命令,使用NGINX插件生成证书:
$ sudo certbot --nginx -d example.com -d www.example.com
  1. 按照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任务。

  1. 打开crontab文件。
$ crontab -e
  1. 添加每日运行的certbot命令。在本例中,该命令每天中午运行。此命令会检查服务器上的证书是否将在未来30天内过期;如果是,则续订证书。--quiet指令用于让certbot不生成输出。
0 12 * * * /usr/bin/certbot renew --quiet
  1. 保存并关闭文件。所有已安装的证书都将自动续期并重新加载。

总结

我们已安装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 | 2022/02/15

NGINX Plus R26 正式发布

NGINX Plus R26通过缓存JSON Web密钥集加快JWT验证,并强化TLS握手,从而提升安全性。NGINX JavaScript的新功能包括增强对异步函数的支持,以及实现WebCrypto API。

使用NGINX App Protect DoS保护gRPC应用,抵御严重的DoS攻击
NGINX | 2022/02/10

使用NGINX App Protect DoS保护gRPC应用,抵御严重的DoS攻击

gRPC具备开发人员设计和部署现代应用所需的速度与灵活性,但其开放性也使其极易受到第7层DoS攻击。NGINX App Protect DoS可保护gRPC应用免受此类破坏性攻击。

Ingress Controller 选型指南(第 2 部分):风险与面向未来的规划
NGINX | 2021/09/13

Ingress Controller 选型指南(第 2 部分):风险与面向未来的规划

了解选择错误的Ingress控制器可能带来的风险,以及如何从关键方面着手,让您的选择更好地适应未来需求。

NGINX Plus R19 正式发布
NGINX | 2019/09/03

NGINX Plus R19 正式发布

NGINX Plus R19扩展了监控功能,不仅提供更多指标,还新增了指标分析方式;增加试运行模式,用于测试限速效果;增强键值存储,以支持IP地址范围;并使限速更加动态。

NGINX现已正式加入F5
NGINX | 2019/05/09

NGINX现已正式加入F5

NGINX现已正式成为F5的一部分。Gus Robertson现任F5 NGINX业务部门负责人。他阐述了两家公司在人才、文化和愿景方面融合的价值,以及双方将如何携手增强NGINX的开源产品和商业产品。

使用NGINX和NGINX Plus实现高性能缓存
NGINX | 2016/08/24

使用NGINX和NGINX Plus实现高性能缓存

我将介绍NGINX在内容缓存和性能方面的工作原理,并分享一些控制NGINX内容缓存方式的技巧。