文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2024-12-02 12:56

关注

使用 TLS/SSL,服务器可以安全地在服务器和客户端之间发送流量,而不会出现消息被外部拦截的可能性。证书系统还帮助用户验证他们正在连接的站点的身份。

在本指南中,我们将向您展示如何在 Ubuntu 20.04 服务器上设置用于 Nginx Web 服务器的自签名 SSL 证书。(见 https://www.linuxmi.com/ubuntu-20-04-nginx-ssl-certificate.html)

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

如果您没有与服务器关联的域名,并且加密的 Web 界面不是面向用户的,则自签名证书可能是合适的。如果您确实有域名,则在许多情况下最好使用 CA 签署的证书。您可以通过Let's Encrypt 项目了解如何设置免费的可信证书(见 https://www.linuxmi.com/ubuntu-20-04-lets-encrypt-nginx.html)。

先决条件

在开始之前,您应该有一个配置了sudo权限并启用防火墙的非 root 用户。

您还需要安装 Nginx Web 服务器。按照我们在 Ubuntu 20.04上安装 Nginx的指南进行操作(见https://www.linuxmi.com/linux-nginx-web-server.html)。确保完成本教程的第 5 步并设置服务器块,因为这是测试 Nginx 是否能够使用您的自签名证书加密连接所必需的。

步骤 1 – 创建 SSL 证书

TLS/SSL 通过公共证书和私钥的组合发挥作用。SSL 密钥在服务器上保密,并对发送给客户端的内容进行加密。SSL 证书与请求内容的任何人公开共享。它可用于解密由相关 SSL 密钥签名的内容。

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

以下是此命令每个部分的作用的细分:

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

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

整个提示将如下所示: 

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

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

在使用 OpenSSL 时,您还应该创建一个强大的 Diffie-Hellman (DH) 组,用于与客户端完全正向保密(perfect forward secrecy)。

您可以通过键入以下内容来执行此操作:

这将需要一段时间,但完成后,您将拥有一个强大的 DH 组,/etc/nginx/dhparam.pem该组将在配置期间使用。

步骤 2 – 配置 Nginx 以使用 SSL

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

首先,您将创建一个配置片段,其中包含有关 SSL 密钥和证书文件位置的信息。然后,您将创建一个具有强 SSL 设置的配置片段,将来可以与任何证书一起使用。最后,您将使用您创建的两个配置片段调整您的 Nginx 服务器块,以便可以适当地处理 SSL 请求。

这种配置 Nginx 的方法将允许您保持干净的服务器块并将常见的配置段放入可重用的模块中。

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

首先,使用您喜欢的文本编辑器在/etc/nginx/snippets目录中创建一个新的 Nginx 配置片段。以下示例使用nano.

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

在此文件中,您需要将ssl_certificate指令设置为您的证书文件和ssl_certificate_key关联的密钥。这将如下所示:

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

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

添加这些行后,保存文件并退出编辑器。如果您曾经nano编辑过该文件,则可以通过按CTRL + X、Y、来进行编辑ENTER。

使用强加密设置创建配置片段

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

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

为了安全地设置 Nginx SSL,我们将调整来自Cipherlist.eu的建议。Cipherlist.eu 是一种有用且易于理解的资源,可用于了解用于流行软件的加密设置。

注意:来自 Cipherlist.eu 的这些建议设置提供了强大的安全性。有时,这是以更高的客户端兼容性为代价的。如果您需要支持旧客户端,则可以通过单击页面上标有“Yes, give me a ciphersuite that works with legacy / old software.(是的,给我一个适用于旧软件/旧软件的密码套件)”的链接来访问该列表。如果需要,您可以用下一个示例代码块的内容替换该列表。

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

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

首先,为上游请求添加首选的 DNS 解析器。我们将在本指南中使用 Google 的 (8.8.8.8和8.8.4.4)。

其次,注释掉设置严格传输安全标头的行。在取消对这一行的注释之前,您应该花点时间阅读HTTP 严格传输安全性或 HSTS,特别是关于“预加载”功能的内容。预加载 HSTS 可提供更高的安全性,但如果意外启用或错误启用,也会产生深远的负面影响。

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

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

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

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

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

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

/etc/nginx/sites-available/your_domain 

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

您的文件可能以不同的顺序,并且代替root和index指令,你可能有一些location,proxy_pass或其它自定义的配置语句。这很好,因为您只需要更新listen指令并包含 SSL 片段。然后修改这个现有的服务器块以在端口上提供 SSL 流量443,并创建一个新的服务器块来响应端口80并自动将流量重定向到端口443。

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

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

/etc/nginx/sites-available/your_domain 

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

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

/etc/nginx/sites-available/your_domain.com 

  1. server {  
  2.     listen 80;  
  3.     listen [::]:80;  
  4.     server_name your_domain.com www.your_domain.com;  
  5.     return 302 https://$server_name$request_uri;  

这是一个简单的配置,它侦听端口80并执行到 HTTPS 的重定向。保存并关闭文件,CTRL + X然后按然后Y,ENTER完成编辑后。

步骤 3 – 调整防火墙

如果您ufw按照先决条件指南的建议启用了防火墙,则需要调整设置以允许 SSL 流量。幸运的是,Nginxufw在安装时注册了一些配置文件。

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

将出现如下列表:

Available applications:

  Nginx Full

  Nginx HTTP

  Nginx HTTPS

  OpenSSH

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

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

  1. Status: active  
  2. To                         Action      From  
  3. --                         ------      ----  
  4. OpenSSH                    ALLOW       Anywhere  
  5. Nginx HTTP                 ALLOW       Anywhere  
  6. OpenSSH (v6)               ALLOW       Anywhere (v6)  
  7. Nginx HTTP (v6)            ALLOW       Anywhere (v6) 

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

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

  1. Status: active  
  2. To                         Action      From  
  3. --                         ------      ----  
  4. OpenSSH                    ALLOW       Anywhere  
  5. Nginx Full                 ALLOW       Anywhere  
  6. OpenSSH (v6)               ALLOW       Anywhere (v6)  
  7. Nginx Full (v6)            ALLOW       Anywhere (v6) 

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

步骤 4 - 在 Nginx 中启用更改

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

首先,检查文件中是否有语法错误。您可以通过键入sudo nginx -t:

如果一切顺利,您将得到如下结果: 

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

注意开头的警告。如前所述,此特定设置会生成警告,因为您的自签名证书无法使用 SSL 装订。这是意料之中的,您的服务器仍然可以正确加密连接。

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

现在系统已使用新更改重新启动,您可以继续进行测试。

步骤 5 – 测试加密

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

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

https://server_domain_or_ip/

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

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

此时,您应该被带到您的站点。在我们的示例中,浏览器地址栏显示一个带有“x”的锁,这意味着无法验证证书。它仍在加密您的连接。请注意,此图标可能会有所不同,具体取决于您的浏览器。

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

http://server_domain_or_ip/

如果这导致相同的图标,则表示您的重定向工作正常。

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

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

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

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

/etc/nginx/sites-available/your_domain.com 

  1. return 301 https://$server_name$request_uri; 

按CTRL + X然后Y和保存并关闭文件ENTER

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

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

重新启动后,将实施更改并且您的重定向现在是永久性的。

结论

您已将 Nginx 服务器配置为对客户端连接使用强加密。这将使您能够安全地处理请求并防止外部各方读取您的流量。或者,您可以选择使用自签名 SSL 证书,该证书可以从 Let's Encrypt 获得,Let's Encrypt 是一个证书颁发机构,可安装免费的 TLS/SSL 证书并在 Web 服务器上启用加密的 HTTPS。从我们关于如何在 Ubuntu 20.04 上使用 Let's Encrypt 保护 Nginx 的教程中了解更多信息(见 https://www.linuxmi.com/ubuntu-20-04-lets-encrypt-nginx.html)。 

来源:Linux公社内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯