如何在 Ubuntu 22.04 中为 Nginx 创建自签名 SSL 证书

介绍

TLS(Transport Layer Security)和其前身 SSL(Secure Sockets Layer)是用于保护和加密计算机网络上的流量的 Web 协议。

借助TLS/SSL,服务器可以安全地在服务器和客户端之间发送流量,而无需外部人员拦截消息的可能性,证书系统还帮助用户验证他们正在连接的网站的身份。

在本指南中,您将设置一个自签名的SSL证书,用于在Ubuntu 22.04 服务器上使用 Nginx 网页服务器。

注: 一个自签证书将加密服务器和任何客户端之间的通信,但是,由于它不是由包含在 Web 浏览器中的任何一个受信任的证书机构签署的,用户无法使用该证书自动验证您的服务器的身份。

如果您没有与您的服务器相关联的域名,并且加密的 Web 接口不针对用户,则可以使用自签名证书。如果您有域名,在许多情况下最好使用 CA 签名证书。您可以通过 [Let's Encrypt 项目] 了解如何设置免费的可信证书(https://andsky.com/tech/tutorials/how-to-secure-nginx-with-let-s-encrypt-on-ubuntu-22-04)。

前提条件

在你开始之前,你应该有一个非根用户配置了)。

您还需要安装 Nginx 网页服务器。 请遵循我们的指南(https://andsky.com/tech/tutorials/how-to-install-nginx-on-ubuntu-22-04)。 请确保完成 Step 5 的教程并设置服务器封锁,因为这将是必要的测试是否 Nginx 能够使用您的自签证书加密连接。

如果你想在你的服务器上安装一个完整的LEMP(Linux, Nginx,MySQL,PHP)堆栈,你可以遵循我们的指南在 设置LEMP在Ubuntu 22.04而不是独立的Nginx安装指南。

步骤 1 – 创建 TLS 证书

TLS/SSL通过公共证书和私钥的组合来运作。SSL密钥在服务器上保密,并加密发送给客户端的内容。SSL证书与任何要求内容的人公开共享。

您可以使用 OpenSSL 在单个命令中创建一个自签名的密钥和证书对:

1sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/nginx-selfsigned.key -out /etc/ssl/certs/nginx-selfsigned.crt

以下是该命令的每个部分所做的分解:

  • 苏多: " sudo " 命令允许 " sudo " 团体的成员将其特权暂时提升到另一个用户(默认是超级用户,或 root** 用户)。 这在这种情况下是必要的,因为我们是在"/etc/"目录下创建证书和密钥对,只有** root** 用户或其他特权账户才能访问.
  • `开放 ' : 这是创建和管理OpenSSL证书,密钥等文件的基本命令行工具.
  • `req': 此子命令指定我们要使用 X. 509 证书签名请求( CSR) 管理 。 "X.509"是SSL和TLS为其密钥和证书管理所遵循的公钥基础设施标准. 我们希望创建一个新的 X. 509 证书, 所以我们正在使用这个子命令 。
  • 联合国 `-x509':这进一步修改了前一个子命令,因为它告诉用户,我们希望制作一个自签名的证书,而不是像通常那样生成证书签名请求。
  • " 节点 " : 这告诉 OpenSSL 跳过选项, 用密码句保护我们的证书 。 我们需要Nginx在服务器启动时能够读取文件,而无需用户干预. 密码句可以防止这种情况发生,因为我们必须在每次重启后输入。
  • " 天数 " 365 ' 号: 此选项将设定证书被视为有效的时间长度 。 我们在这里定了一年
  • -新rsa:2048': 它指定我们要同时生成新的证书和新的密钥 。 我们没有在前一个步骤中创建签名证书所需的密钥,所以我们需要与证书一起创建证书. rsa:2048'部分要求它制作长为2048比特的RSA密钥。
  • " 钥匙 " : 此行告诉 OpenSSL 将生成的私有密钥文件放置在哪里 。
  • `出': 这告诉 OpenSSL 将我们创建的证书放在哪里 。 .

如前所述,这些选项将创建一个关键文件和一个证书. 运行此命令后,您将被问到有关您的服务器的几个问题,以便正确嵌入证书中的信息。

正确地填写提示。 **最重要的行是请求常用名称(例如服务器FQDN或您的名称)的行。

整个提示将看起来如下:

1[secondary_label Output]
2Country Name (2 letter code) [AU]:US
3State or Province Name (full name) [Some-State]:New York
4Locality Name (eg, city) []:New York City
5Organization Name (eg, company) [Internet Widgits Pty Ltd]:Bouncy Castles, Inc.
6Organizational Unit Name (eg, section) []:Ministry of Water Slides
7Common Name (e.g. server FQDN or YOUR name) []:server_IP_address
8Email Address []:admin@your_domain.com

您创建的两个文件都将放置在 /etc/ssl 目录的相应子目录中。

在使用 OpenSSL 时,您还应该创建一个强大的 Diffie-Hellman (DH) 组,用于与客户端谈判 Perfect Forward Secrecy

您可以通过键入这样做:

1sudo openssl dhparam -out /etc/nginx/dhparam.pem 4096

这将需要一段时间,但一旦完成,您将有一个强大的DH组在/etc/nginx/dhparam.pem,将被用在配置过程中。

步骤 2 — 配置 Nginx 使用 SSL

现在您已创建了/etc/ssl目录中的密钥和证书文件,您需要修改您的 Nginx 配置以利用它们。

首先,您将创建一个配置片段,包含有关 SSL 密钥和证书文件位置的信息。然后,您将创建一个配置片段,具有强大的 SSL 设置,可在未来与任何证书一起使用。

这种配置 Nginx 的方法将允许您保持服务器块清洁,并将常见的配置部分放入可重复使用的模块中。

创建指向SSL密钥和证书的配置片段

首先,使用您喜爱的文本编辑器在/etc/nginx/snippets目录中创建新的 Nginx 配置片段。

要正确区分此文件的目的,请将其命名为 self-signed.conf:

1sudo nano /etc/nginx/snippets/self-signed.conf

在此文件中,您需要为您的证书文件设置ssl_certificate指令,并为相关密钥设置ssl_certificate_key

1[label /etc/nginx/snippets/self-signed.conf]
2ssl_certificate /etc/ssl/certs/nginx-selfsigned.crt;
3ssl_certificate_key /etc/ssl/private/nginx-selfsigned.key;

添加这些行后,保存文件并离开编辑器. 如果您使用nano来编辑文件,您可以通过按CTRL + X,Y,然后ENTER来完成编辑。

创建具有强大的加密设置的配置片段

接下来,您将创建另一个片段,将定义一些SSL设置,这将为 Nginx设置一个强大的SSL加密套件,并启用一些先进的功能,以帮助保持您的服务器安全。

您设置的参数可以在未来的 Nginx 配置中重复使用,因此您可以给该文件一个通用名称:

1sudo nano /etc/nginx/snippets/ssl-params.conf

为了安全地设置 Nginx SSL,我们将调整从 Cipherlist.eu的建议。

<$>[注] :从Cipherlist.eu提供的这些建议的设置提供强大的安全性。有时,这会以更大的客户端兼容性为代价。如果您需要支持较旧的客户端,有一个替代列表可以通过点击标记是的,给我一个与传统 / 旧软件一起工作的加密套件的页面上的链接来访问。

使用哪个配置的选择将很大程度上取决于您需要支持的内容,这两者都将提供极大的安全性。

为了您的目的,复制提供的设置全部,但首先,你需要做一些小的修改。

首先,为上游请求添加您偏好的 DNS 解析器,我们将使用 Google 的(‘8.8.8.8’和‘8.8.4.4’)为本指南。

第二,评论一条规定严格运输安全标题的行。在不评论此行之前,你应该花一会儿时间阅读到 HTTP 严格运输安全,或 HSTS,特别是关于 [). 重新加载 HSTS提供了增强的安全性,但如果意外启用或不正确启用,也可以产生深远的负面后果。

将以下内容添加到您的 ssl-params.conf 片段文件中:

 1[label /etc/nginx/snippets/ssl-params.conf]
 2ssl_protocols TLSv1.3;
 3ssl_prefer_server_ciphers on;
 4ssl_dhparam /etc/nginx/dhparam.pem; 
 5ssl_ciphers EECDH+AESGCM:EDH+AESGCM;
 6ssl_ecdh_curve secp384r1;
 7ssl_session_timeout 10m;
 8ssl_session_cache shared:SSL:10m;
 9ssl_session_tickets off;
10ssl_stapling on;
11ssl_stapling_verify on;
12resolver 8.8.8.8 8.8.4.4 valid=300s;
13resolver_timeout 5s;
14# Disable strict transport security for now. You can uncomment the following
15# line if you understand the implications.
16#add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload";
17add_header X-Frame-Options DENY;
18add_header X-Content-Type-Options nosniff;
19add_header X-XSS-Protection "1; mode=block";

由于您正在使用自签证书,所以不会使用SSL堆积。 Nginx会发出警告并禁用我们自签证书的堆积,但会继续正常运作。

保存和关闭文件,按CTRL + X,然后按YENTER,当你完成。

调整 Nginx 配置以使用 SSL

现在你有你的片段,你可以调整 Nginx 配置以启用 SSL。

在本指南中,我们将假设您正在使用/etc/nginx/sites-available目录中的自定义服务器封锁配置文件。本指南还遵循先决条件的 Nginx 教程的惯例,并为此示例使用/etc/nginx/sites-available/your_domain

在继续前进之前,备份您的当前配置文件:

1sudo cp /etc/nginx/sites-available/your_domain /etc/nginx/sites-available/your_domain.bak

现在,打开配置文件以进行调整:

1sudo nano /etc/nginx/sites-available/your_domain

内部,您的服务器封锁可能以如下方式开始:

 1[label /etc/nginx/sites-available/your_domain]
 2server {
 3        listen 80;
 4        listen [::]:80;
 5
 6        root /var/www/your_domain/html;
 7        index index.html index.htm index.nginx-debian.html;
 8
 9        server_name your_domain www.your_domain;
10
11        location / {
12                try_files $uri $uri/ =404;
13        }
14}

你的文件可能以不同的顺序,而不是索引指令,你可能有一些位置,proxy_pass或其他自定义配置声明。这很好,因为你只需要更新倾听指令并包括SSL片段。然后修改现有的服务器块来服务SSL流量在端口443,并创建一个新的服务器块来响应端口80,并自动重定向流量到端口443

注意:使用 302 重定向,直到您确认一切正常工作,之后,您将更改为永久的 301 重定向。

在现有的配置文件中,更新两个倾听语句以使用端口443ssl,然后包括您在上一步创建的两个片段文件:

 1[label /etc/nginx/sites-available/your_domain]
 2server {
 3    listen 443 ssl;
 4    listen [::]:443 ssl;
 5    include snippets/self-signed.conf;
 6    include snippets/ssl-params.conf;
 7
 8root /var/www/your_domain/html;
 9        index index.html index.htm index.nginx-debian.html;
10
11  server_name your_domain.com www.your_domain.com;
12
13  location / {
14                try_files $uri $uri/ =404;
15        }
16}

接下来,在第一个块的关闭轴(})后,在配置文件中添加第二个服务器块:

 1[label /etc/nginx/sites-available/your_domain.com]
 2
 3server {
 4    listen 80;
 5    listen [::]:80;
 6
 7    server_name your_domain.com www.your_domain.com;
 8
 9    return 302 https://$server_name$request_uri;
10}

这是一个裸体配置,在端口80上倾听并执行重定向到HTTPS。保存并关闭文件,然后按CTRL + X然后按YENTER,当您完成编辑时。

第3步:调整防火墙

如果您已启用ufw防火墙,根据前提指南的建议,您将需要调整设置以允许SSL流量。

您可以通过键入查看可用的配置文件:

1sudo ufw app list

一个列表如下将出现:

1[secondary_label Output]
2Available applications:
3  Nginx Full
4  Nginx HTTP
5  Nginx HTTPS
6  OpenSSH

您可以通过键入sudo ufw status来检查当前设置:

1sudo ufw status

它可能会产生以下响应,这意味着只允许 HTTP 流量到 Web 服务器:

1[secondary_label Output]
2Status: active
3
4To Action From
5--                         ------      ----
6OpenSSH ALLOW Anywhere
7Nginx HTTP ALLOW Anywhere
8OpenSSH (v6)               ALLOW Anywhere (v6)
9Nginx HTTP (v6)            ALLOW Anywhere (v6)

若要允许 HTTPS 流量,您可以更新Nginx Full配置文件的权限,然后删除Nginx HTTP配置文件的余额权限:

1sudo ufw allow 'Nginx Full'
2sudo ufw delete allow 'Nginx HTTP'

在运行sudo ufw status后,您应该收到以下输出:

1sudo ufw status
1[secondary_label Output]
2Status: active
3
4To Action From
5--                         ------      ----
6OpenSSH ALLOW Anywhere
7Nginx Full ALLOW Anywhere
8OpenSSH (v6)               ALLOW Anywhere (v6)
9Nginx Full (v6)            ALLOW Anywhere (v6)

此输出确认您的防火墙的调整成功,您已准备好在 Nginx 中启用更改。

步骤4:启用 Nginx 中的更改

完成防火墙的更改和调整后,您可以重新启动 Nginx 来实现新的更改。

首先,检查文件中没有语法错误,您可以通过键入sudo nginx -t来做到这一点:

1sudo nginx -t

如果一切顺利,你会得到一个结果,它说:

1[secondary_label Output]
2nginx: [warn] "ssl_stapling" ignored, issuer certificate not found for certificate "/etc/ssl/certs/nginx-selfsigned.crt"
3nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
4nginx: configuration file /etc/nginx/nginx.conf test is successful

如前所述,此特定设置会生成警告,因为您的自签证书不能使用SSL堆栈,因此您的服务器仍然可以正确加密连接。

如果您的输出匹配我们的示例,您的配置文件没有语法错误. 如果是这样的情况,那么您可以安全地重新启动 Nginx 来实现更改:

1sudo systemctl restart nginx

现在系统已经重新启动了新的更改,您可以继续测试。

步骤5:测试加密

现在,您已经准备好测试您的SSL服务器了。

打开您的网页浏览器,然后输入https://,然后输入您的服务器的域名或IP地址栏:

1https://server_domain_or_IP

根据您的浏览器,您可能会收到警告,因为您创建的证书不是由您的浏览器的信任证书机构之一签署的:

Nginx self-signed cert warning

这个警告是预期和正常的. 我们只对我们的证书的加密方面感兴趣,而不是对我们的主机的真实性进行第三方验证。

Nginx self-signed override

在此时,您应该被带到您的网站,在我们的示例中,浏览器地址栏显示一个锁,上面有x,这意味着证书无法验证。它仍然加密您的连接。

如果您配置了 Nginx 用两个服务器块,自动将 HTTP 内容重定向到 HTTPS,您还可以检查重定向是否正常工作:

1http://server_domain_or_IP

如果这导致相同的图标,这意味着您的重定向工作正确。

步骤 6 — 更改到永久重定向

如果您的重定向工作正确,并且您确信只希望允许加密流量,您应该修改 Nginx 配置以使重定向永久。

再次打开服务器封锁配置文件:

1sudo nano /etc/nginx/sites-available/your_domain

找到返回302并将其更改为返回301:

1[label /etc/nginx/sites-available/your_domain.com]
2    return 301 https://$server_name$request_uri;

保存并关闭文件,按CTRL + X,然后按YENTER

检查您的配置语法错误:

1sudo nginx -t

当你准备好时,重新启动 Nginx 以使重定向永久:

1sudo systemctl restart nginx

重新启动后,这些更改将被执行,您的重定向现在是永久性的。

结论

您已经配置了您的 Nginx 服务器, 以便使用强大的加密连接客户端 。 这将允许你安全地满足请求 并阻止外界阅读您的流量。 或者,您可以选择使用自签名的 SSL 证书,该证书可从 Let ' s Encrypt 中获取。 Let's Encrypt 是一个安装免费 TLS/ SSL 证书并在网络服务器上允许加密 HTTPS 的证书权威机构。 从我们关于).

Published At
Categories with 技术
comments powered by Disqus