网站搜索

如何在 Ubuntu 和 Debian 上使用 Let's Encrypt 保护 Nginx


继之前有关 Apache SSLLet's Encrypt 教程之后,在本文中,我们将讨论如何生成和安装由 Let's Encrypt CA 颁发的免费 SSL/TLS 证书 适用于 UbuntuDebian 上的 Nginx 网络服务器。

另请阅读
  1. 在 Ubuntu 和 Debian 上使用免费的 Let’s Encrypt 保护 Apache
  2. 在 RHEL 和 CentOS 上安装 Let’s Encrypt SSL 以保护 Apache
测试样本环境

要求

  1. 具有有效 DNS A 记录的注册域,可指向您服务器的 IP 地址。
  2. 安装了启用了 SSL 和 Vhost 的 Nginx Web 服务器,以防您计划托管多个域或子域。

第 1 步:安装 Nginx Web 服务器

1. 第一步,通过发出以下命令安装 Nginx Web 服务器(如果尚未安装):

sudo apt-get install nginx

第 2 步:为 Nginx 生成 Let’s Encrypt SSL 证书

2. 在生成免费的 SSL/TLS 证书之前,请在 /usr/local/ 文件系统层次结构中安装 Let's Encrypt 软件>git 客户端,通过发出以下命令:

sudo apt-get -y install git
cd /usr/local/
sudo git clone https://github.com/letsencrypt/letsencrypt

3. 虽然获取 Nginx 证书的过程是自动化的,但您仍然可以使用 Let’s Encrypt Standalone 插件手动为 Nginx 创建和安装免费的 SSL 证书。

此方法要求端口 80 不得在短时间内在您的系统上使用,而 Let’s Encrypt 客户端会在生成证书之前验证服务器的身份。

如果您已经在运行 Nginx,请通过发出以下命令停止该服务。


sudo service nginx stop
OR
sudo systemctl stop nginx

如果您正在运行绑定在端口 80 上的其他服务,也请停止该服务。

4. 通过运行 netstat 命令确认端口 80 空闲:

sudo netstat -tlpn | grep 80

5. 现在是时候运行 letsencrypt 来获取 SSL 证书了。转到 /usr/local/letsencrypt 系统路径中的 Let's Encrypt 安装目录,并通过提供 certonly letsencrypt-auto 命令>--standalone 选项和 -d 标志用于您希望生成证书的每个域或子域。

cd /usr/local/letsencrypt
sudo ./letsencrypt-auto certonly --standalone -d your_domain.tld 

6. 输入 Let’s Encrypt 将用于恢复丢失密钥或发出紧急通知的电子邮件地址。

7.按 Enter 键同意许可条款。

8.最后,如果一切顺利,您的终端控制台上应该会出现类似于下面屏幕截图的消息。

第3步:在Nginx中安装Let’s Encrypt SSL证书

9. 现在您的 SSL 证书已生成,是时候配置 Nginx Web 服务器来使用它了。新的 SSL 证书放置在以您的域名命名的目录下的 /etc/letsencrypt/live/ 中。运行 ls 命令列出为您的域颁发的证书文件。

sudo ls /etc/letsencrypt/live/
sudo ls -al /etc/letsencrypt/live/caeszar.tk

10. 接下来,使用文本编辑器打开 /etc/nginx/sites-available/default 文件,并在指定开头的第一个注释行之后添加以下块SSL 块。使用下面的屏幕截图作为指导。

sudo nano /etc/nginx/sites-enabled/default

Nginx 块摘录:

SSL configuration
        #
        listen 443 ssl default_server;
        ssl_certificate /etc/letsencrypt/live/caeszar.tk/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/caeszar.tk/privkey.pem;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;
        ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';
        ssl_dhparam /etc/nginx/ssl/dhparams.pem;

相应地替换 SSL 证书的域名值。

11.下一步在/etc/nginx/ssl/目录中生成一个强大的Diffie-Hellman密码,以保护您的服务器免受通过运行以下命令来进行Logjam攻击。

sudo mkdir /etc/nginx/ssl
cd /etc/nginx/ssl
sudo openssl dhparam -out dhparams.pem 2048

12.最后,重新启动 Nginx 守护进程以反映更改。

sudo systemctl restart nginx

并通过访问以下 URL 测试您的 SSL 证书。

https://www.ssllabs.com/ssltest/analyze.html

第 4 步:自动续订 Let's Encrypt Nginx 证书

13.Let’s Encrypt CA颁发的证书有效期为 90 天。为了在到期日期之前自动更新文件,请在 /usr/local/bin/ 目录中创建 ssl-renew.sh bash 脚本,并包含以下内容。

sudo nano /usr/local/bin/ssl-renew.sh

将以下内容添加到 ssl-renew.sh 文件中。

#!/bin/bash

cd /usr/local/letsencrypt
sudo ./letsencrypt-auto certonly -a webroot --agree-tos --renew-by-default --webroot-path=/var/www/html/ -d your_domain.tld
sudo systemctl reload nginx
exit 0

替换 --webroot-path 变量以匹配您的 Nginx 文档根目录。通过发出以下命令确保脚本可执行。

sudo chmod +x /usr/local/bin/ssl-renew.sh

14. 最后添加一个 cron 作业,每两个月在午夜运行一次脚本,以确保您的证书将在到期前大约 30 天更新。

sudo crontab -e

在文件底部添加以下行。

0 1 1 */2 * /usr/local/bin/ssl-renew.sh >> /var/log/your_domain.tld-renew.log 2>&1

就是这样!您的 Nginx 服务器现在使用免费的 Let’s Encrypt SSL 证书提供 SSL 内容。