TLS或称传输层安全性,及其前身SSL(代表安全套接字层)是用于将正常流量包装在受保护的加密包装中的Web协议。
使用这种技术,服务器可以在服务器和客户端之间安全地发送流量,而不会被外部各方拦截。证书系统还可以帮助用户验证他们正在连接的站点的身份。
在本教程中,我们将向您展示如何设置自签名SSL证书,以便与Ubuntu16.04服务器上的NginxWeb服务器一起使用。
注意:自签名证书将加密服务器与任何客户端之间的通信。但是,由于Web浏览器不包含任何受信任的证书颁发机构的签名,因此用户无法使用该证书自动验证服务器的身份。
如果您没有与服务器关联的域名以及加密Web界面不面向用户的实例,则可能需要使用自签名证书。
完成准备内容后,请继续以下操作。
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您将被问到一系列问题。在我们讨论之前,让我们看看我们发出的命令中发生了什么:
如上所述,这些选项将创建密钥文件和证书。我们将询问有关我们服务器的一些问题,以便将信息正确地嵌入到证书中。
适当填写提示。最重要的一行是CommonName(e.g.serverFQDNorYOURname)那一行。您需要输入与服务器关联的域名,或者是您服务器的公共IP地址。
整个提示将如下所示:
OutputCountryName(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目录的相应子目录中。
我们可以通过输入以下内容来执行:
sudoopenssldhparam-out/etc/ssl/certs/dhparam.pem2048这可能需要几分钟,但一旦完成,您将拥有一个强大的DH组/etc/ssl/certs/dhparam.pem,我们可以在我们的配置中使用。
我们在/etc/ssl目录下创建了密钥和证书文件。现在我们只需要修改我们的Nginx配置就可以利用它们。
我们将对配置进行一些调整。
这种配置Nginx的方法将允许我们保持干净的服务器块并将常见配置段放入可重用模块中。
首先,让我们在/etc/nginx/snippets目录中创建一个新的Nginx配置代码段。
为了正确区分此文件的目的,我们称之为self-signed.conf:
ssl_certificate/etc/ssl/certs/nginx-selfsigned.crt;ssl_certificate_key/etc/ssl/private/nginx-selfsigned.key;添加这些行后,保存并关闭该文件。
接下来,我们将创建另一个片段,用于定义一些SSL设置。这将使Nginx具有强大的SSL密码套件,并启用一些有助于保证我们的服务器安全的高级功能。
我们将设置的参数可以在将来的Nginx配置中重用,因此我们将为该文件指定一个通用名称:
sudonano/etc/nginx/snippets/ssl-params.conf链接到上述网站的建议设置提供了强大的安全性。有时,这是以更高的客户端兼容性为代价的。如果您需要支持较旧的客户端,可以通过单击标记为“是的,给我一个与旧版/旧版软件一起使用的密码套件”的页面上的链接来访问该列表。该列表可以替换下面复制的项目。
您使用哪种配置的选择在很大程度上取决于您需要支持的内容。它们都将提供很大的安全性。
出于我们的目的,我们可以完整地复制提供的设置。我们只需要进行一些小的修改。
首先,我们将为上游请求添加我们首选的DNS解析器。我们将使用Google。我们还将继续将ssl_dhparam设置为指向我们之前生成的Diffie-Hellman文件。
完成后保存并关闭文件。
现在我们已经有了我们的代码片段,我们可以调整我们的Nginx配置来启用SSL。
我们将在本教程中假设您正在使用目录/etc/nginx/sites-available中的default服务器块文件。如果您使用的是其他服务器块文件,请在以下命令中替换它的名称。
在我们继续之前,让我们备份当前的服务器块文件:
sudocp/etc/nginx/sites-available/default/etc/nginx/sites-available/default.bak现在,打开服务器块文件进行调整:
sudonano/etc/nginx/sites-available/default在里面,您的服务器块可能像这样:
server{listen80default_server;listen[::]:80default_server;#SSLconfiguration#listen443ssldefault_server;#listen[::]:443ssldefault_server;...我们将修改此配置,以便将未加密的HTTP请求自动重定向到加密的HTTPS中。这为我们的网站提供了最佳安全性。如果要同时允许HTTP和HTTPS流量,请使用后面的备用配置。
我们将把配置分成两个独立的块。在第一个listen指令之后,我们将添加一个server_name指令,设置为服务器的域名,或者是IP地址。然后,我们将设置重定向到我们将要创建的第二个服务器块中。之后,我们将关闭这个短块:
注意:我们将使用302重定向,直到我们确认一切正常。接下来,我们可以将其更改为永久301重定向。
注意:您可能只有一个listen指令,其中包含每个IP版本和端口组合的default_server修饰符。如果您为这些端口启用了其他default_server设置的服务器块,则必须从其中一个块中删除修饰符。
如果您想要或需要同时允许加密和未加密内容,则必须以不同方式配置Nginx。如果可以避免,通常不建议这样做,但在某些情况下可能是必要的。基本上,我们只要将两个单独的服务器块压缩为一个块并删除重定向:
如果ufw启用了防火墙,则必须按照本教程准备中的建议,调整设置以允许SSL流量。幸运的是,ufw在安装时注册了一些Nginx配置文件。
我们可以通过输入以下内容来查看可用的配置文件
sudoufwapplist您应该看到如下列表:
Availableapplications:NginxFullNginxHTTPNginxHTTPSOpenSSH您可以输入以下内容来查看当前设置:
sudoufwstatus它可能看起来像这样,这意味着只允许HTTP流量进入Web服务器:
OutputStatus:activeToActionFrom------------OpenSSHALLOWAnywhereNginxHTTPALLOWAnywhereOpenSSH(v6)ALLOWAnywhere(v6)NginxHTTP(v6)ALLOWAnywhere(v6)为了进一步允许HTTPS流量,我们可以允许“NginxFull”配置文件,然后删除冗余的“NginxHTTP”配置文件限额:
sudoufwallow'NginxFull'sudoufwdeleteallow'NginxHTTP'您的状态现在应该如下所示:
sudoufwstatusOutputStatus:activeToActionFrom------------OpenSSHALLOWAnywhereNginxFullALLOWAnywhereOpenSSH(v6)ALLOWAnywhere(v6)NginxFull(v6)ALLOWAnywhere(v6)第四步:启用Nginx中的更改现在我们已经进行了更改并调整了防火墙,我们可以重新启动Nginx以实现我们的新更改。
首先,我们应该检查以确保我们的文件中没有语法错误。我们可以通过输入以下内容来执行:
sudonginx-t如果一切顺利,您将得到如下结果:
Outputnginx:[warn]"ssl_stapling"ignored,issuercertificatenotfoundnginx:theconfigurationfile/etc/nginx/nginx.confsyntaxisoknginx:configurationfile/etc/nginx/nginx.conftestissuccessful注意开始前的警告。如前所述,由于我们的自签名证书无法使用SSL装订,因此此特定设置会发出警告。这是预期的,我们的服务器仍然可以正确加密连接。
如果输出与上述内容匹配,则配置文件没有语法错误。我们可以安全地重启Nginx以实现我们的更改:
sudosystemctlrestartnginx第五步:测试加密现在,我们已准备好测试我们的SSL服务器。
这是预期和正常的。我们只对证书的加密方面感兴趣,而不是对主机真实性的第三方验证感兴趣。单击“高级”,然后提供链接以继续进入您的主机:
你应该被带到你的网站。如果你在浏览器地址栏中查看,你会看到一个带有“x”的锁。在这种情况下,这只意味着无法验证证书。它仍在加密您的连接。
如果您使用两个服务器块配置Nginx,自动将HTTP内容重定向到HTTPS,您还可以检查重定向是否正常运行:
如果您的重定向工作正常并且您确定只想允许加密流量,则应修改Nginx配置以使重定向永久化。