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

介绍

TLS,或传输层安全性,及其前身SSL,代表安全套接字层,是用于保护和加密计算机网络流量的web协议。

有了TLS/SSL,服务器可以在服务器和客户端之间安全地发送通信,而不存在消息被外部方截获的可能性。证书系统还帮助用户验证他们连接的站点的身份。

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

**注意:**自签名证书将加密服务器和任何客户端之间的通信。但是,由于它不是由web浏览器中包含的任何受信任的证书颁发机构签名的,因此用户无法使用该证书自动验证服务器的身份。

如果您没有与服务器关联的域名,并且加密的web界面不面向用户,则自签名证书可能是合适的。如果您确实有域名,在许多情况下,最好使用CA签名的证书。您可以了解如何使用让我们加密项目设置免费的受信任证书。

先决条件

在开始之前,应该为非root用户配置sudo权限并启用防火墙。您可以按照我们的Ubuntu 22.04的初始服务器设置学习如何设置这样的用户帐户。

您还需要安装Nginx web服务器。请遵循我们的指南在Ubuntu 22.04上安装Nginx。确保完成教程的步骤5并设置服务器块,因为这对于测试Nginx是否能够使用自签名证书加密连接是必要的。

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

步骤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

下面是此命令每个部分的功能分解:

  • sudo:sudo命令允许sudo组的成员临时将其权限提升到另一个用户(默认情况下为超级用户或根用户)的权限。在这种情况下,这是必要的,因为我们正在/etc/目录下创建证书和密钥对,该目录只能由root用户或其他特权帐户访问。

  • openssl:这是用于创建和管理OpenSSL证书、密钥和其他文件的基本命令行工具。

  • req:该子命令指定要使用X.509证书签名请求(CSR)管理。“X.509”是SSL和TLS在密钥和证书管理方面遵循的公钥基础设施标准。我们想创建一个新的X.509证书,所以我们使用这个子命令。

  • -x509:这进一步修改了前面的子命令,告诉实用程序我们希望生成自签名证书,而不是像通常情况下那样生成证书签名请求。

  • -nodes:这告诉OpenSSL跳过使用密码短语保护证书的选项。我们需要Nginx能够在服务器启动时读取文件,而无需用户干预。密码短语可以防止这种情况发生,因为我们必须在每次重新启动后输入密码。

  • -days 365:此选项设置证书被视为有效的时间长度。我们在这里定了一年。

  • -newkey rsa:2048:这指定我们希望同时生成一个新证书和一个新密钥。在上一步中,我们没有创建签署证书所需的密钥,因此我们需要将其与证书一起创建。rsa:2048部分告诉它生成2048位长的RSA密钥。

  • -keyout:这一行告诉OpenSSL在哪里放置我们正在创建的生成的私钥文件。

  • -out:这告诉OpenSSL将我们正在创建的证书放置在哪里。

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

适当填写提示最重要的一行是请求Common Name (e.g. server FQDN or YOUR name)的那一行。你需要输入与你的服务器相关的域名,或者更可能是你的服务器的公共IP地址

整个提示如下所示:

OutputCountry 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设置为相关密钥。如下所示:

/etc/nginx/snippets/self-signed.conf

ssl_certificate /etc/ssl/certs/nginx-selfsigned.crt;
ssl_certificate_key /etc/ssl/private/nginx-selfsigned.key;

添加这些行后,保存文件并退出编辑器。如果使用nano编辑文件,可以按CTRL + XYENTER进行编辑。

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

接下来,您将创建另一个代码段来定义一些SSL设置。这将为Nginx设置一个强大的SSL密码套件,并启用一些有助于保持服务器安全的高级功能。

您设置的参数可以在未来的Nginx配置中重用,因此您可以为文件指定一个通用名称:

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

为了安全地设置Nginx SSL,我们将修改Cipherlist.eu中的建议。Cipherlist.eu是了解流行软件使用的加密设置的有用且易于理解的资源。

注:这些来自Cipherlist.eu的建议设置提供了强大的安全性。有时,这是以提高客户端兼容性为代价的。如果您需要支持较旧的客户端,可以通过单击页面上标记为“是的,给我一个可用于旧软件的密码套件”的链接来访问另一个列表。如果需要,您可以用下一个示例代码块的内容替代该列表。

选择使用哪种配置在很大程度上取决于您需要支持什么。它们都将提供极大的安全性。

出于您的目的,请完整复制提供的设置,但首先,您需要进行一些小的修改。

首先,为上游请求添加首选DNS解析程序。我们将使用谷歌的(8.8.8.88.8.4.4)作为本指南。

其次,注释掉设置严格传输安全标头的行。在取消注释这一行之前,您应该花点时间阅读HTTP Strict Transport Security,或HST,特别是关于[preload]功能的内容(https://hstspreload.appspot.com/)。预加载HST提供了更高的安全性,但如果意外启用或错误启用,也可能产生深远的负面后果。

将以下内容添加到ssl-params.conf代码段文件中:

/etc/nginx/snippets/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 + XYENTER保存并关闭文件。

调整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

在内部,服务器块的开头可能类似于以下内容:

/etc/nginx/sites available/your\ u域

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;
        }
}

文件的顺序可能不同,您可能有一些locationproxy_pass或其他自定义配置语句,而不是rootindex指令。这很好,因为您只需要更新listen指令并包括SSL片段。然后修改此现有服务器块以服务端口443上的SSL通信,并创建一个新的服务器块以响应端口80并自动将通信重定向到端口443

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

在现有配置文件中,更新两个listen语句以使用port 443ssl,然后包括在前面步骤中创建的两个代码段文件:

/etc/nginx/sites available/your\ u域

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;
        }
}
  

接下来,在第一个服务器块的右括号(})之后,将第二个服务器块添加到配置文件中:

/etc/nginx/sites available/your\u domain.com

server {
    listen 80;
    listen [::]:80;
    server_name your_domain.com www.your_domain.com;
    return 302 https://$server_name$request_uri;
}

这是一种基本配置,侦听端口80并执行重定向到HTTPS。编辑完成后,按CTRL + XYENTER保存并关闭文件。

步骤3-调整防火墙

如果按照必备指南的建议启用了ufw防火墙,则需要调整设置以允许SSL通信。幸运的是,Nginx在安装时向ufw注册了一些配置文件。

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

sudo ufw app list

将出现如下列表:

OutputAvailable applications:
  Nginx Full
  Nginx HTTP
  Nginx HTTPS
  OpenSSH

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

sudo ufw status

它可能会生成以下响应,这意味着只允许HTTP流量进入web服务器:

OutputStatus: 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”配置文件的权限,然后删除冗余的“nginxhttp”配置文件余量:

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

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

sudo ufw status
OutputStatus: 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

如果一切都成功,你会得到如下结果:

Outputnginx: [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服务器了。

打开web浏览器,在地址栏中键入https://,然后键入服务器的域名或IP:

https://server_domain_or_IP

根据您的浏览器,您可能会收到警告,因为您创建的证书没有由浏览器的可信证书颁发机构之一签名:

Nginx自签名证书警告

此警告是正常的。我们只对证书的加密方面感兴趣,而不是对主机真实性的第三方验证。单击**“ADVANCED”**然后单击提供的链接继续访问您的主机:

Nginx自签名覆盖

此时,您应该被带到您的站点。在我们的示例中,浏览器地址栏显示了一个上面带有“x”的锁,这意味着无法验证证书。它仍在加密您的连接。请注意,此图标可能因浏览器而异。

如果使用两个服务器块配置Nginx,自动将HTTP内容重定向到HTTPS,还可以检查重定向功能是否正确:

http://server_domain_or_IP

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

步骤6-更改为永久重定向

如果重定向工作正常,并且确定只允许加密流量,则应修改Nginx配置以使重定向永久化。

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

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

找到return 302并将其更改为return 301:

/etc/nginx/sites available/your\u domain.com

	return 301 https://$server_name$request_uri;

CTRL + XYENTER保存并关闭文件

检查您的配置是否存在语法错误:

sudo nginx -t

准备好后,重新启动Nginx以使重定向永久化:

sudo systemctl restart nginx

重启后,更改将被实现,您的重定向现在是永久性的。

结论

您已将Nginx服务器配置为对客户端连接使用强加密。这将允许您安全地服务请求,并防止外部各方读取您的流量。或者,您可以选择使用自签名SSL证书,该证书可以从Let’s Encrypt获得。Let’sEncrypte是一个证书颁发机构,它安装免费的TLS/SSL证书,并在web服务器上启用加密的HTTPS。从我们的教程中了解更多关于How To Secure Nginx with Let’s Encrypt on Ubuntu 22.04的信息。

本文源自: https://devpress.csdn.net/linux/62eba40220df032da732b9fc.html 

 

posted @ 2023-08-01 16:36  风无心客  阅读(502)  评论(0编辑  收藏  举报