当前位置: 首页 > 科技观察

如何在Ubuntu20.04中为Nginx创建自签名SSL证书

时间:2023-03-17 20:48:45 科技观察

介绍TLS或传输层安全及其前身SSL代表安全套接字层,是一种用于保护和加密计算机网络流量的Web协议。使用TLS/SSL,服务器可以安全地在服务器和客户端之间发送流量,而没有消息被外部拦截的可能性。证书系统还可以帮助用户验证他们正在连接的站点的身份。在本指南中,我们将向您展示如何在Ubuntu20.04服务器上为NginxWeb服务器设置自签名SSL证书。(参见https://www.linuxmi.com/ubuntu-20-04-nginx-ssl-certificate.html)注意:自签名证书将加密您的服务器和任何客户端之间的通信。但是,由于它未由Web浏览器中包含的任何受信任的证书颁发机构签名,因此用户无法使用此证书自动验证您的服务器的身份。如果您没有与服务器关联的域名,并且加密的Web界面不面向用户,则自签名证书可能是合适的。如果您有域名,在许多情况下最好使用CA签名的证书。您可以通过Let'sEncrypt项目了解如何设置免费的可信证书(请参阅https://www.linuxmi.com/ubuntu-20-04-lets-encrypt-nginx.html)。先决条件在开始之前,您应该为非根用户配置sudo权限并启用防火墙。您还需要安装NginxWeb服务器。按照我们在Ubuntu20.04上安装Nginx的指南进行操作(请参阅https://www.linuxmi.com/linux-nginx-web-server.html)。确保完成本教程的第5步并设置服务器块,因为这是测试Nginx是否能够使用您的自签名证书加密连接所必需的。第1步-创建SSL证书TLS/SSL通过公共证书和私钥的组合工作。SSL密钥在服务器上保密,并对发送到客户端的内容进行加密。SSL证书与请求内容的任何人公开共享。它可用于解密由关联的SSL密钥签名的内容。您可以在单个命令中使用OpenSSL创建自签名密钥和证书对:sudoopensslreq-x509-nodes-days365-newkeyrsa:2048-keyout/etc/ssl/private/nginx-selfsigned.key-out/etc/ssl/certs/nginx-selfsigned.crt以下是该命令各部分功能的细分:sudo:sudo命令允许sudo组的成员临时将他们的权限提升到另一个用户(默认为超级用户或root)允许。在这种情况下这是必要的,因为我们在/etc/目录下创建证书和密钥对,只能由root或其他特权帐户访问。openssl:这是用于创建和管理OpenSSL证书、密钥和其他文件的基本命令行工具。req:此子命令指定我们要使用X.509证书签名请求(CSR)管理。“X.509”是SSL和TLS遵循其密钥和证书管理的公钥基础设施标准。我们想要创建一个新的X.509证书,所以我们使用这个子命令。-x509:这进一步修改了之前的子命令,它告诉实用程序我们想要创建一个自签名证书,而不是像通常发生的那样生成证书签名请求。-nodes:这告诉OpenSSL跳过密码保护我们证书的选项。当服务器启动时,我们需要Nginx能够在没有用户干预的情况下读取文件。密码可以防止这种情况发生,因为我们必须在每次重启后输入密码。-days365:此选项设置证书被视为有效的时间长度。我们在这里住了一年。-newkeyrsa:2048:这指定我们要生成新证书和新密钥。我们没有在上一步中创建签署证书所需的密钥,因此我们需要将其与证书一起创建。rsa:2048部分告诉它生成一个2048位长的RSA密钥。-keyout:此行告诉OpenSSL将我们正在创建的生成的私钥文件放在哪里。-out:这告诉OpenSSL将我们正在创建的证书放在哪里。如前所述,这些选项将创建密钥文件和证书。运行此命令后,系统会询问您一些有关服务器的问题,以便将信息正确嵌入证书中。适当填写提示。最重要的一行是请求通用名称(例如服务器FQDN或您的名称)。您将需要输入与您的服务器关联的域名,或者更可能是您服务器的公共IP地址。整个提示将如下所示:CountryName(2lettercode)[AU]:USStateorProvinceName(fullname)[Some-State]:NewYorkLocalityName(eg,city)[]:NewYorkCityOrganizationName(eg,company)[InternetWidgitsPtyLtd]:BouncyCastles,Inc.OrganizationalUnitName(eg,section)[]:MinistryofWaterSlidesCommonName(e.g.serverFQDNorYOURname)[]:server_IP_addressEmailAddress[]:admin@your_domain.com您创建的两个文件都将放在/etc/ssl目录的相应子目录中。使用OpenSSL时,您还应该创建一个强大的Diffie-Hellman(DH)组,以实现与客户端的完美前向保密。您可以通过键入以下内容来执行此操作:sudoopenssldhparam-out/etc/nginx/dhparam.pem4096这将需要一段时间,但完成后,您将拥有一个强大的DH组,/etc/nginx/dhparam.pem这组将在配置期间使用。第2步-配置Nginx以使用SSL现在/etc/ssl目录下的密钥和证书文件已经创建,您需要修改Nginx配置以使用它们。首先,您将创建一个配置片段,其中包含有关SSL密钥和证书文件位置的信息。然后,您将创建一个具有强大SSL设置的配置片段,将来可以与任何证书一起使用。最后,您将使用您创建的两个配置片段来调整您的Nginx服务器块,以便可以适当地处理SSL请求。这种配置Nginx的方法将允许您保持干净的服务器块并将公共配置部分放入可重用的模块中。创建一个指向SSL密钥和证书的配置片段首先,使用您最喜欢的文本编辑器在/etc/nginx/snippets目录中创建一个新的Nginx配置片段。以下示例使用纳米。为了正确区分此文件的用途,将其命名为self-signed.conf:sudonano/etc/nginx/snippets/self-signed.conf在该文件中,您需要将ssl_certificate指令设置为您的证书文件和关联的密钥使用ssl_certificate_key。这看起来像这样:/etc/nginx/snippets/self-signed.confssl_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配置中重复使用,因此您可以为该文件起一个通用名称:sudonano/etc/nginx/snippets/ssl-params.conf为了安全地设置NginxSSL,我们将从密码表。欧盟的建议。Cipherlist.eu是一个有用且易于理解的资源,可用于了解流行软件的加密设置。注意:这些来自Cipherlist.eu的推荐设置提供了强大的安全性。有时这是以更大的客户端兼容性为代价的。如果您需要支持旧版客户端,您可以通过单击标记为“Yes,givemeaciphersuitethatworkswithlegacy/oldsoftware.(是的,给我一个适用于旧版/旧软件的密码套件。)”的页面来实现。链接以访问列表。如果需要,您可以将此列表替换为下一个示例代码块的内容。您选择使用哪种配置在很大程度上取决于您需要支持的内容。他们都将提供很大的安全性。为了您的目的,请完整复制提供的设置,但首先,您需要进行一些小的修改。首先,为上游请求添加首选DNS解析器。我们将在本指南中使用Google的(8.8.8.8和8.8.4.4)。其次,注释掉设置StrictTransportSecurity标头的行。在取消注释此行之前,您应该花点时间阅读HTTP严格传输安全性或HSTS,尤其是关于“预加载”功能的内容。预加载HSTS可提高安全性,但如果意外或错误启用,也会产生深远的负面影响。将以下内容添加到您的ssl-params.conf片段文件中:/etc/nginx/snippets/ssl-params.confssl_protocolsTLSv1.3;ssl_prefer_server_cipherson;ssl_dhparam/etc/nginx/dhparam.pem;ssl_ciphersEECDH+AESGCM:EDH+AESGCM;ssl_ecdh8_server_cipherson;ssl_dhparam;ssl_session_cacheshared:SSL:10m;ssl_session_ticketsoff;ssl_staplingon;ssl_stapling_verifyon;resolver8.8.8.88.8.4.4valid=300s;resolver_timeout5s;#Disablestricttransportsecurityfornow.Youcanuncommentthefollowing#lineifyouunderstandtheimplications.#add_headerStrict-Transport-Security"max-age=63072000;includeSubDomains;preload";add_headerX-Frame-OptionsDENY;add_headerX-Content-Type-Optionsnosniff;add_headerX-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在继续之前,请备份您当前的配置文件:sudocp/etc/nginx/sites-available/your_domain/etc/nginx/sites-available/your_domain.bak现在,打开配置文件调整:sudonano/etc/nginx/sites-available/your_domain在你的服务器块内可能看起来像这样:/etc/nginx/sites-available/your_domainserver{listen80;listen[::]:80;root/var/www/your_domain/html;indexindex.htmlindex.htmindex.nginx-debian.html;server_nameyour_domainwww.your_domain;location/{try_files$uri$uri/=404;}}你的文件可能有不同的顺序,并且您可能有一些位置、proxy_pass或其他自定义配置语句,而不是root和index指令。这很好,因为您只需要更新listen指令并包含SSL片段。然后修改这个现有的服务器块以在端口443上提供SSL流量,并创建一个响应端口80并自动将流量重定向到端口443的新服务器块。注意:使用302重定向直到您确定一切正常。之后,您将其更改为永久301重定向。在您现有的配置文件中,更新两个侦听语句以使用端口443和ssl,然后包含您在前面的步骤中创建的两个片段文件:/etc/nginx/sites-available/your_domainserver{listen443ssl;listen[::]:443ssl;includesnippets/self-signed.conf;includesnippets/ssl-params.conf;root/var/www/your_domain/html;indexindex.htmlindex.htmindex.nginx-debian.html;server_nameyour_domain.comwww.your_domain。com;location/{try_files$uri$uri/=404;}}接下来,将第二个服务器块添加到配置文件中第一个块的右括号(})之后:/etc/nginx/sites-available/your_domain。comserver{listen80;listen[::]:80;server_nameyour_domain.comwww.your_domain.com;return302https://$server_name$request_uri;}这是一个简单的配置,监听80端口,执行到重定向的HTTPS。保存并关闭文件,CTRL+X然后Y,完成编辑后回车。第3步-调整防火墙如果您的ufw按照先决条件指南中的建议启用了防火墙,您将需要调整设置以允许SSL流量。幸运的是,Nginxufw在安装时注册了一些配置文件。您可以通过键入以下内容查看可用的配置文件:sudoufwapplist将出现如下列表:可用应用程序:NginxFullNginxHTTPNginxHTTPSOpenSSH您可以通过键入sudoufwstatus检查当前设置:sudoufwstatusit以下响应可能会生成,这意味着web服务器只允许HTTP流量:Status:activeToActionFrom------------OpenSSHALLOWAnywhereNginxHTTPALLOWAnywhereOpenSSH(v6)ALLOWAnywhere(v6)NginxHTTP(v6)ALLOWAnywhere(v6)允许HTTPS流量,您可以更新“NginxFull”配置文件的权限,然后删除多余的“NginxHTTP”配置文件配额:sudoufwallow'NginxFull'sudoufwdeleteallow'NginxHTTP'收到以下输出:sudoufwstatusStatus:activeToActionFrom------------OpenSSHALLOWAnywhereNginxFullALLOWAnywhereOpenSSH(v6)ALLOWAnywhere(v6)NginxFull(v6)ALLOWAnywhere(v6)此输出确认防火墙调整成功并且是您已准备好启用Nginx中的更改。第4步-在Nginx中启用更改对防火墙进行更改和调整后,您可以重新启动Nginx以实施新更改。首先,检查文件是否存在语法错误。您可以通过键入sudonginx-t来执行此操作:sudonginx-t如果一切顺利,您将得到如下结果:nginx:[warn]"ssl_stapling"ignored,issuecertificatenotfoundforcertificate"/etc/ssl/certs/nginx-selfsigned.crt"nginx:theconfigurationfile/etc/nginx/nginx.confsyntaxisoknginx:configurationfile/etc/nginx/nginx.conftestissuccessful注意开头的警告。如前所述,此特定设置会生成警告,因为您的自签名证书无法使用SSL装订。这是意料之中的,您的服务器仍将正确加密连接。如果您的输出与我们的示例匹配,则您的配置文件没有语法错误。如果是这种情况,那么您可以安全地重启Nginx以实施更改:sudosystemctlrestartnginx现在系统已重新启动并具有新的更改,您可以继续测试。第5步-测试加密现在您已准备好测试您的SSL服务器。打开您的Web浏览器,https://并在地址栏中输入服务器的域名或IP:https://server_domain_or_IP根据您的浏览器,您可能会收到警告,因为您创建的证书不是由您创建的对于浏览器的受信任证书颁发机构,此警告是预期的且正常的。我们只对我们证书的加密方面感兴趣,而不对我们主机真实性的第三方验证感兴趣。单击“高级”,然后单击提供的链接以继续您的托管:此时,您应该会被带到您的站点。在我们的示例中,浏览器地址栏显示一个带“x”的锁,表示无法验证证书。它仍在加密您的连接。请注意,此图标可能因您的浏览器而异。如果Nginx配置了两个自动将HTTP内容重定向到HTTPS的服务器块,您还可以检查重定向是否有效:http://server_domain_or_IP如果这导致相同的图标,则您的重定向工作正常。第6步-更改为永久重定向如果您的重定向工作正常并且您确定只允许加密流量,您应该修改Nginx配置以使重定向永久化。再次打开服务器块配置文件:sudonano/etc/nginx/sites-available/your_domain找到return302并将其更改为return301:/etc/nginx/sites-available/your_domain.comreturn301https://$server_name$request_uri;按CTRL+X然后按Y并保存并关闭文件ENTER检查您的配置是否存在语法错误:sudonginx-t准备好后,重新启动Nginx以使重定向永久化:sudosystemctlrestart当nginx重新启动时,它将实施更改并且您重定向现在是永久性的。结论您已将Nginx服务器配置为对客户端连接使用强加密。这将使您能够安全地处理请求并防止外部各方读取您的流量。或者,您可以选择使用自签名SSL证书,该证书可以从Let'sEncrypt获得,这是一个安装免费TLS/SSL证书并在Web服务器上启用加密HTTPS的证书颁发机构。从我们的教程中了解有关如何在Ubuntu20.04上使用Let'sEncrypt保护Nginx的更多信息(请参阅https://www.linuxmi.com/ubuntu-20-04-lets-encrypt-nginx.html)。