介绍
TLS(传输层安全协议)及其前身 SSL(安全套接字层协议)是用于保护和加密计算机网络上流量的网络协议。.
借助 TLS/SSL,服务器可以安全地在服务器和客户端之间传输数据,防止外部方拦截消息。证书系统还能帮助用户验证他们所访问网站的身份。.
在本指南中,您将设置一个自签名 SSL 证书,以便在 Ubuntu 服务器上与 Nginx Web 服务器一起使用。.
先决条件
- 开始之前,您必须配置一个具有 sudo 权限的非 root 用户,并启用防火墙。.
- 您还需要安装 Nginx Web 服务器。.
- 如果您想在服务器上安装完整的 LEMP 堆栈(Linux、Nginx、MySQL、PHP)。.
步骤 1 – 创建 TLS 证书
TLS/SSL 协议结合了公钥和私钥。SSL 密钥保存在服务器端,用于加密发送给客户端的内容。SSL 证书则公开共享给所有请求该内容的用户。用户可以使用该证书解密由关联的 SSL 密钥签名的内容。.
使用 OpenSSL,只需一条命令即可生成自签名密钥对和证书:
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/nginx-selfsigned.key -out /etc/ssl/certs/nginx-selfsigned.crt以下是该命令各部分功能的概要:
sudosudo 命令允许 sudo 组的成员临时提升其权限至其他用户(默认情况下为超级用户或 root 用户)。在本例中,这是必要的,因为我们将在 /etc/ 目录中创建证书和密钥对,而该目录只能由 root 用户或其他特权帐户访问。.openssl这是用于创建和管理 OpenSSL 证书、密钥和其他文件的主要命令行工具。.要求此子命令指定我们要使用 X.509 证书签名请求 (CSR) 管理。“X.509”是公钥基础设施标准,SSL 和 TLS 都遵循该标准进行密钥和证书管理。我们要创建一个新的 X.509 证书,因此使用此子命令。.- –
x509:此命令修改了前面的子命令,表示我们要创建自签名证书,而不是像通常那样创建证书签名请求。. - –
节点这告诉 OpenSSL 跳过使用密码保护证书的选项。我们需要 Nginx 在服务器启动时无需用户干预即可读取该文件。密码会阻止这种情况发生,因为每次重启后我们都必须输入密码。. -第365天此选项决定证书的有效期。这里我们将其设置为一年。.-newkey rsa:2048:指定我们要同时生成新证书和新密钥。由于上一步中我们没有创建用于签署证书的密钥,因此需要与证书一起创建密钥。rsa:2048 部分指示它创建一个长度为 2048 位的 RSA 密钥。.-keyout:此行告诉 OpenSSL 将我们正在创建的生成的私钥文件放置在哪里。.-出去:这告诉 OpenSSL 将我们正在创建的证书放在哪里。.
如前所述,这些选项会同时创建密钥文件和证书。运行此命令后,系统会询问您一些关于服务器的问题,以便将信息正确嵌入证书中。.
请正确填写命令。最重要的一行是要求输入共享名称(即服务器的完全限定域名或您的姓名)的那一行。您需要输入与您的服务器关联的域名,或者更常见的情况是输入服务器的公网 IP 地址。.
完整的命令如下:
Output
Country Name (2 letter code) [AU]:US
State or Province Name (full name) [Some-State]:New York
Locality Name (eg, city) []:New York City
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Bouncy Castles, Inc.
Organizational Unit Name (eg, section) []:Ministry of Water Slides
Common Name (e.g. server FQDN or YOUR name) []:server_IP_address
Email Address []:admin@your_domain.com您创建的两个文件将放置在 /etc/ssl 目录的相应子目录中。.
在使用 OpenSSL 时,您还应该创建一个强大的 Diffie-Hellman (DH) 组,该组在与客户端协商时使用完全前向保密。.
您可以通过输入以下命令来完成此操作:
sudo openssl dhparam -out /etc/nginx/dhparam.pem 4096这需要一些时间,但一旦完成,您将在 /etc/nginx/dhparam.pem 中拥有一个强大的 DH 组,该组将在配置期间使用。.
步骤 2 – 配置 Nginx 使用 SSL
现在密钥和证书文件已在 /etc/ssl 目录中创建,您需要修改 Nginx 配置以使用它们。.
首先,您需要创建一个配置片段,其中包含 SSL 密钥和证书文件的位置信息。接下来,您需要创建一个配置片段,其中包含可用于未来任何证书的强 SSL 设置。最后,您需要使用创建的两个配置片段来配置 Nginx 服务器块,以便正确处理 SSL 请求。.
这种配置 Nginx 的方法可以让你保持服务器块的整洁,并将常用的配置部分放入可重用的模块中。.
创建一个指向 SSL 密钥和证书的配置片段
首先,使用您喜欢的文本编辑器在 /etc/nginx/snippets 文件夹中创建一个新的 Nginx 配置片段。以下示例使用 nano 编辑器。.
为了正确标识此文件的用途,请将其命名为 self-signed.conf:
sudo nano /etc/nginx/snippets/self-signed.conf在这个文件中,你需要将 ssl_certificate 指令设置为证书文件,并将 ssl_certificate_key 设置为关联的密钥。它看起来会像这样:
ssl_certificate /etc/ssl/certs/nginx-selfsigned.crt;
ssl_certificate_key /etc/ssl/private/nginx-selfsigned.key;添加完这些行后,保存文件并退出编辑器。如果您使用 nano 编辑器编辑文件,可以按 CTRL + X、Y,然后按 ENTER 键退出。.
创建具有强加密设置的配置片段
接下来,您需要创建另一个组件来定义一些 SSL 设置。这将为 Nginx 设置强大的 SSL 加密套件,并启用一些有助于保护服务器安全的高级功能。.
您设置的参数可以在以后的 Nginx 配置中重复使用,因此您可以给该文件指定一个通用名称:
sudo nano /etc/nginx/snippets/ssl-params.conf为了安全地配置 Nginx SSL,我们采用了 Cipherlist.eu 的建议。Cipherlist.eu 是一个实用且易于理解的资源,可以帮助用户了解常用软件的加密设置。.
请完全复制提供的设置,但您需要先做一些小的改动。.
首先,添加您首选的上游请求 DNS 解析器。本指南将使用 Google 的 DNS 解析器(8.8.8.8 和 8.8.4.4)。.
其次,注释掉指定严格传输安全 (HSTS) 标头的那行代码。在取消注释之前,您应该花点时间了解一下 HTTP 严格传输安全 (HSTS),特别是其中的“预加载”功能。HSTS 预加载可以提供额外的安全性,但如果意外启用或启用不当,也可能造成广泛的负面影响。.
将以下内容添加到您的 ssl-params.conf 片段文件中:
ssl_protocols TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_dhparam /etc/nginx/dhparam.pem;
ssl_ciphers EECDH+AESGCM:EDH+AESGCM;
ssl_ecdh_curve secp384r1;
ssl_session_timeout 10m;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off;
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;
# Disable strict transport security for now. You can uncomment the following
# line if you understand the implications.
#add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload";
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";由于您使用的是自签名证书,因此不会启用 SSL 证书装订。Nginx 会输出警告并禁用我们签名证书的证书装订,但之后仍能正常工作。.
完成后,按 CTRL + X 保存并关闭文件,然后按 Y 和 ENTER 键。.
配置 Nginx 使用 SSL
现在你已经有了所需的组件,可以调整 Nginx 配置以启用 SSL 了。.
本指南假设您在 `/etc/nginx/sites-available` 目录中使用自定义服务器块配置文件。本指南遵循 Nginx 预备教程的惯例,并以 `/etc/nginx/sites-available/your_domain` 作为示例。如有必要,请替换为您的配置文件名称。.
在继续操作之前,请备份您当前的配置文件:
sudo cp /etc/nginx/sites-available/your_domain /etc/nginx/sites-available/your_domain.bak现在打开配置文件进行设置:
sudo nano /etc/nginx/sites-available/your_domain在内部,您的服务器模块可能以类似于以下内容的方式开始:
server {
listen 80;
listen [::]:80;
root /var/www/your_domain/html;
index index.html index.htm index.nginx-debian.html;
server_name your_domain www.your_domain;
location / {
try_files $uri $uri/ =404;
}
}
您的文件顺序可能不同,并且可能包含 location、proxy_pass 或其他自定义配置指令,而不是 root 和 directory 指令。这没关系,因为您只需要更新 listen 指令并添加 SSL 配置。然后修改现有的服务器块,使其在 443 端口上提供 SSL 流量服务,并创建一个新的服务器块来监听 80 端口,并将流量自动重定向到 443 端口。.
在现有配置文件中,将两条监听语句更新为使用端口 443 和 SSL,然后添加您在前面步骤中创建的两个片段文件:
server {
listen 443 ssl;
listen [::]:443 ssl;
include snippets/self-signed.conf;
include snippets/ssl-params.conf;
root /var/www/your_domain/html;
index index.html index.htm index.nginx-debian.html;
server_name your_domain.com www.your_domain.com;
location / {
try_files $uri $uri/ =404;
}
}接下来,在配置文件中第一个服务器配置块的右大括号 (}) 之后添加第二个服务器配置块:
server {
listen 80;
listen [::]:80;
server_name your_domain.com www.your_domain.com;
return 302 https://$server_name$request_uri;
}这是一个最基本的配置,监听 80 端口并重定向到 HTTPS。编辑完成后,请按 CTRL + X,然后按 Y,最后按 ENTER 保存并关闭文件。.
步骤 3 – 配置防火墙
如果您已按照先决条件指南的建议启用了 ufw 防火墙,则需要调整设置以允许 SSL 流量。幸运的是,Nginx 在安装时会自动向 ufw 注册一些配置文件。.
您可以通过输入以下文字浏览可用个人资料:
sudo ufw app list将显示类似如下的列表:
Output
Available applications:
Nginx Full
Nginx HTTP
Nginx HTTPS
OpenSSH您可以通过输入 sudo ufw status 命令来检查当前设置:
sudo ufw status它可能会产生以下响应,这意味着只允许 HTTP 流量访问 Web 服务器:
Output
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
Nginx HTTP ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
Nginx HTTP (v6) ALLOW Anywhere (v6)要允许 HTTPS 流量,您可以更新«Nginx Full»配置文件的权限,然后删除额外的«Nginx HTTP»权限:
sudo ufw allow 'Nginx Full'
sudo ufw delete allow 'Nginx HTTP'运行 sudo ufw status 命令后,您应该会看到以下输出:
sudo ufw statusOutput
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
Nginx Full ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
Nginx Full (v6) ALLOW Anywhere (v6)此输出确认您的防火墙配置已成功完成,您可以启用 Nginx 中的更改。.
步骤 4 – 在 Nginx 中启用更改
完成防火墙更改和配置后,您可以重启 Nginx 以应用新的更改。.
首先,检查文件中是否存在语法错误。您可以通过输入 sudo nginx -t 来完成此操作:
sudo nginx -t如果一切顺利,您将收到如下所示的结果:
Output
nginx: [warn] "ssl_stapling" ignored, issuer certificate not found for certificate "/etc/ssl/certs/nginx-selfsigned.crt"
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful请注意开头的警告。如前所述,此特定设置会生成警告,因为您的签名证书无法使用 SSL 加密。这是预期行为,您的服务器仍然能够正确加密连接。.
如果您的输出与我们的示例一致,则说明您的配置文件没有语法错误。如果是这样,您可以安全地重启 Nginx 以应用更改:
sudo systemctl restart nginx系统已使用新更改重新启动,现在您可以继续测试。.
步骤 5 – 测试加密
现在,您可以开始测试您的 SSL 服务器了。.
打开您的网络浏览器,在地址栏中输入 https://,后跟您的服务器域名或 IP 地址:
根据您使用的浏览器,您可能会收到警告,因为创建的证书并非由您浏览器信任的证书颁发机构签名:
此警告属于正常现象。我们只关注证书的加密功能,不涉及您主机凭据的第三方验证。请点击“高级”,然后点击提供的链接访问您的主机:
此时,您应该会被重定向到您的网站。在我们的示例中,浏览器地址栏会显示一个带有“x”的锁形图标,表示证书无法验证。但它仍然会加密您的连接。请注意,此图标在不同的浏览器中可能显示不同。.
如果您已使用两个服务器块配置了 Nginx,并自动将 HTTP 内容重定向到 HTTPS,您还可以检查重定向是否正常工作:
如果结果显示相同的图标,则表示您的重定向已成功完成。.
步骤 6 – 更改为永久重定向
如果您的重定向功能正常工作,并且您确定只允许加密流量,则需要更改 Nginx 配置以使重定向永久生效。.
重新打开服务器块配置文件:
sudo nano /etc/nginx/sites-available/your_domain找到 302 重定向并将其更改为 301 重定向:
return 301 https://$server_name$request_uri;
按 CTRL + X,然后按 Y,最后按 ENTER 保存并关闭文件。
检查您的设置是否存在语法错误:
sudo nginx -t准备就绪后,重启 Nginx 以使重定向永久生效:
sudo systemctl restart nginx重启后,更改将生效,您的重定向现在是永久性的。.
结果
您已将 Nginx 服务器配置为使用强加密来保护客户端连接。这可以安全地处理请求,并防止外部人员读取您的流量。或者,您可以使用自签名 SSL 证书,该证书可从 Let's Encrypt 获取。Let's Encrypt 是一家证书颁发机构,可安装免费的 TLS/SSL 证书,并在 Web 服务器上启用加密的 HTTPS。.











