如何在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 + X
、Y
、ENTER
进行编辑。
创建具有强加密设置的配置段
接下来,您将创建另一个代码段来定义一些SSL设置。这将为Nginx设置一个强大的SSL密码套件,并启用一些有助于保持服务器安全的高级功能。
您设置的参数可以在未来的Nginx配置中重用,因此您可以为文件指定一个通用名称:
sudo nano /etc/nginx/snippets/ssl-params.conf
为了安全地设置Nginx SSL,我们将修改Cipherlist.eu中的建议。Cipherlist.eu是了解流行软件使用的加密设置的有用且易于理解的资源。
注:这些来自Cipherlist.eu的建议设置提供了强大的安全性。有时,这是以提高客户端兼容性为代价的。如果您需要支持较旧的客户端,可以通过单击页面上标记为“是的,给我一个可用于旧软件的密码套件”的链接来访问另一个列表。如果需要,您可以用下一个示例代码块的内容替代该列表。
选择使用哪种配置在很大程度上取决于您需要支持什么。它们都将提供极大的安全性。
出于您的目的,请完整复制提供的设置,但首先,您需要进行一些小的修改。
首先,为上游请求添加首选DNS解析程序。我们将使用谷歌的(8.8.8.8
和8.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 + 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
在内部,服务器块的开头可能类似于以下内容:
/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;
}
}
文件的顺序可能不同,您可能有一些location
、proxy_pass
或其他自定义配置语句,而不是root
和index
指令。这很好,因为您只需要更新listen
指令并包括SSL片段。然后修改此现有服务器块以服务端口443
上的SSL通信,并创建一个新的服务器块以响应端口80
并自动将通信重定向到端口443
。
**注意:**使用302重定向,直到您确认一切正常。之后,您将此更改为永久301重定向。
在现有配置文件中,更新两个listen
语句以使用port 443
和ssl
,然后包括在前面步骤中创建的两个代码段文件:
/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 + X
、Y
和ENTER
保存并关闭文件。
步骤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
根据您的浏览器,您可能会收到警告,因为您创建的证书没有由浏览器的可信证书颁发机构之一签名:
此警告是正常的。我们只对证书的加密方面感兴趣,而不是对主机真实性的第三方验证。单击**“ADVANCED”**然后单击提供的链接继续访问您的主机:
此时,您应该被带到您的站点。在我们的示例中,浏览器地址栏显示了一个上面带有“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 + X
、Y
和ENTER
保存并关闭文件
检查您的配置是否存在语法错误:
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