介绍
TLS或传输层安全性(transport layer security)及其前身SSL (SSL代表安全套接字层)是用于将正常流量包装在受保护的加密包装器中的web协议。
使用这种技术,服务器可以在服务器和客户机之间安全地发送通信,而不会被外部方截获消息。证书系统还帮助用户验证他们正在连接的站点的身份。
在本指南中,我们将向您展示如何设置自签名SSL证书,以便与CentOS 7服务器上的Nginx web服务器一起使用。
注意:自签名证书将加密服务器和任何客户机之间的通信。但是,由于它不是由web浏览器中包含的任何受信任的证书颁发机构签名的,因此用户不能使用该证书自动验证服务器的身份。
如果您没有与服务器关联的域名,并且加密的web接口不是面向用户的,那么自签名证书可能是合适的。如果您确实有一个域名,在许多情况下,最好使用ca签名的证书。要了解如何设置一个免费的受信任证书,请按照我们的指南使用CentOS 7上的Let’s Encrypt证书设置Nginx。
预备知识
首先,您应该配置具有sudo特权的非根用户。您可以通过遵循CentOS 7的初始服务器设置来学习如何设置这样的用户帐户。
当您准备开始时,作为sudo用户登录到服务器。
步骤1:安装Nginx并调整防火墙
在开始之前,我们应该确保Nginx web服务器安装在我们的机器上。
虽然Nginx在CentOS的默认存储库中不可用,但它存在于EPEL(企业Linux的额外包)存储库中。我们可以通过输入以下命令,使EPEL存储库允许我们的服务器访问Nginx包:
1 | $ sudo yum install epel-release |
接下来,我们可以输入以下命令来安装Nginx:
1 | $ sudo yum install nginx |
输入以下命令启动Nginx服务:
1 | $ sudo systemctl start nginx |
通过键入来检查服务是否启动并运行
1 | $ systemctl status nginx |
- 1234567nginx.service - The nginx HTTP and reverse proxy serverLoaded: loaded (/usr/lib/systemd/system/nginx.service; disabled; vendor preset: disabled)Active: <span class="highlight">active (running)</span> since Fri 2017-01-06 17:27:50 UTC; 28s ago. . .Jan 06 17:27:50 centos-512mb-nyc3-01 systemd[1]: <span class="highlight">Started The nginx HTTP and reverse proxy server.</span>
您还需要启用Nginx,所以它在您的服务器启动时启动:
1 | $ sudo systemctl enable nginx |
1 2 | Output Created symlink from /etc/systemd/system/multi-user.target.wants/nginx.service to /usr/lib/systemd/system/nginx.service. |
接下来,我们需要确保没有使用防火墙阻止对端口80和443的访问。如果您没有使用防火墙,可以跳到下一节。
如果您正在运行firewalld防火墙,可以输入以下命令打开这些端口:
1 2 3 | $ sudo firewall-cmd --add-service=http $ sudo firewall-cmd --add-service=https $ sudo firewall-cmd --runtime-to-permanent |
如果iptables防火墙正在运行,则需要运行的命令高度依赖于当前的规则集。
1 2 | $ sudo iptables -I INPUT -p tcp -m tcp --dport 80 -j ACCEPT $ sudo iptables -I INPUT -p tcp -m tcp --dport 443 -j ACCEPT |
现在您应该能够通过web浏览器访问默认的Nginx页面。
步骤2:创建SSL证书
TLS/SSL通过使用公共证书和私钥的组合来工作。SSL密钥在服务器上是保密的。它用于加密发送给客户端的内容。SSL证书公开与任何请求内容的人共享。它可以用于解密由关联SSL密钥签名的内容。
可以用来保存公共证书的/etc/ssl/certs目录应该已经存在于服务器上。让我们也创建一个/etc/ssl/private目录来保存私钥文件。由于此密钥的保密对安全至关重要,我们将锁定权限,以防止未经授权的访问:
1 2 | $ sudo mkdir /etc/ssl/private $ sudo chmod 700 /etc/ssl/private |
现在,我们可以使用OpenSSL在一个命令中创建自签名密钥和证书对,输入以下命令:
1 | $ sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/nginx-selfsigned.key -out /etc/ssl/certs/nginx-selfsigned.crt |
你将被问到一系列的问题。在我们讨论这个问题之前,让我们看看我们发出的命令中发生了什么:
- 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将我们正在创建的证书放置在何处。
如上所述,这些选项将创建密钥文件和证书。为了将信息正确地嵌入到证书中,我们将被问及一些关于服务器的问题。
适当地填写提示。最重要的行是请求公共名称(例如服务器FQDN或您的名称)的行。您需要输入与您的服务器或服务器的公共IP地址相关联的域名。
所有的提示看起来是这样的:
1 2 3 4 5 6 7 8 | Output Country 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组,用于与客户协商完美的转发保密。
我们可以通过输入:
1 | $ sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048 |
这可能需要几分钟,但当它完成时,您将在/etc/ssl/certs/ dhparamat有一个强大的DH组。我们可以在配置中使用的pem。
步骤3:配置Nginx以使用SSL
CentOS中的默认Nginx配置是非结构化的,默认HTTP服务器块位于主配置文件中。Nginx将检查/etc/ Nginx /conf中以.conf结尾的文件。用于其他配置的d目录。
我们将在这个目录中创建一个新文件,以配置使用我们生成的证书文件提供内容的服务器块。然后我们可以选择配置默认服务器块,将HTTP请求重定向到HTTPS。
创建TLS/SSL服务器块
创建并打开一个名为ssl.conf文件在/etc/nginx/conf.d目录
1 | $ sudo vi /etc/nginx/conf.d/ssl.conf |
在内部,首先打开一个服务器块。默认情况下,TLS/SSL连接使用端口443,因此这应该是我们的侦听端口。server_name应该设置为您在生成证书时用作通用名称的服务器的域名或IP地址。接下来,使用ssl_certificate、ssl_certificate_key和ssl_dhparam指令来设置我们生成的SSL文件的位置:
/etc/nginx/conf.d/ssl.conf
1 2 3 4 5 6 7 8 9 10 | server { listen 443 http2 ssl; listen [::]:443 http2 ssl; server_name server_IP_address; ssl_certificate /etc/ssl/certs/nginx-selfsigned.crt; ssl_certificate_key /etc/ssl/private/nginx-selfsigned.key; ssl_dhparam /etc/ssl/certs/dhparam.pem; } |
接下来,我们将添加一些额外的SSL选项,以提高站点的安全性。我们将使用的选项是Remy van Elst关于密码学的建议。圣的网站。本网站旨在为流行软件提供易于使用的加密设置。通过阅读Nginx上强大的SSL安全性,您可以了解更多关于他关于Nginx选择的决定。
注意:密码的默认建议设置。st提供强大的安全性。有时,这是以更高的客户端兼容性为代价的。如果您需要支持老客户端,可以通过单击标记为“Yes, give me a ciphersuite that works with legacy / old software”的链接来访问另一个列表。
可以在两个注释块之间使用兼容性列表,而不是上面配置中的默认建议。选择使用哪种配置在很大程度上取决于需要支持什么。
您可能希望修改配置的一些部分。首先,您可以将用于上游请求的首选DNS解析器添加到解析器指令。我们在本指南中使用了谷歌,但是如果您有其他首选项,可以更改它。
最后,您应该花一些时间来研究HTTP严格传输安全,特别是“预加载”功能。预加载HSTS提供了更高的安全性,但如果意外启用或不正确启用,则可能产生深远的影响。在本指南中,我们不会预加载这些设置,但是如果您确定理解了其中的含义,您可以对其进行修改。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | /etc/nginx/conf.d/ssl.conf server { listen 443 http2 ssl; listen [::]:443 http2 ssl; server_name server_IP_address; ssl_certificate /etc/ssl/certs/nginx-selfsigned.crt; ssl_certificate_key /etc/ssl/private/nginx-selfsigned.key; ssl_dhparam /etc/ssl/certs/dhparam.pem; ######################################################################## # from https://cipherli.st/ # # and https://raymii.org/s/tutorials/Strong_SSL_Security_On_nginx.html # ######################################################################## ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_prefer_server_ciphers on; ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH"; ssl_ecdh_curve secp384r1; 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 preloading HSTS for now. You can use the commented out header line that includes # the "preload" directive if you understand the implications. #add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload"; add_header Strict-Transport-Security "max-age=63072000; includeSubdomains"; add_header X-Frame-Options DENY; add_header X-Content-Type-Options nosniff; ################################## # END https://cipherli.st/ BLOCK # ################################## } |
因为我们使用的是自签名证书,所以不会使用SSL绑定。Nginx将简单地输出一个警告,禁用自签名证书的装订,并继续正确操作。
最后,为您的站点添加Nginx配置的其余部分。这取决于您的需要。我们只是复制一些在我们的例子的默认位置块中使用的指令,它将设置文档根目录和一些错误页面:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | /etc/nginx/conf.d/ssl.conf server { listen 443 http2 ssl; listen [::]:443 http2 ssl; server_name server_IP_address; ssl_certificate /etc/ssl/certs/nginx-selfsigned.crt; ssl_certificate_key /etc/ssl/private/nginx-selfsigned.key; ssl_dhparam /etc/ssl/certs/dhparam.pem; ######################################################################## # from https://cipherli.st/ # # and https://raymii.org/s/tutorials/Strong_SSL_Security_On_nginx.html # ######################################################################## . . . ################################## # END https://cipherli.st/ BLOCK # ################################## root /usr/share/nginx/html; location / { } error_page 404 /404.html; location = /404.html { } error_page 500 502 503 504 /50x.html; location = /50x.html { } } |
完成后,保存并退出。这将配置Nginx使用生成的SSL证书加密通信。指定的SSL选项确保只使用最安全的协议和密码。注意,这个示例配置只是服务于默认的Nginx页面,因此您可能需要修改它以满足您的需要。
(可选)创建从HTTP到HTTPS的重定向
在我们当前的配置中,Nginx用加密的内容响应端口443上的请求,但是用未加密的内容响应端口80上的请求。这意味着我们的站点提供加密,但不强制使用它。对于某些用例,这可能是好的,但是通常需要加密更好。当密码等机密数据可能在浏览器和服务器之间传输时,这一点尤其重要。
幸运的是,默认的Nginx配置文件允许我们通过在/etc/nginx/default.中添加文件,轻松地向默认端口80服务器块添加指令d目录。创建一个名为ssl-redirect的新文件。conf并打开它,使用以下命令进行编辑:
1 | $ sudo vi /etc/nginx/default.d/ssl-redirect.conf |
然后粘贴在这一行:
1 2 3 | /etc/nginx/default.d/ssl-redirect.conf return 301 https://$host$request_uri/; |
完成后保存并关闭文件。这将在端口80(默认)服务器块上配置HTTP,以便将传入请求重定向到我们配置的HTTPS服务器块。
步骤4:启用Nginx中的更改
现在我们已经进行了更改,可以重新启动Nginx来实现新的配置。
首先,我们应该检查以确保文件中没有语法错误。我们可以通过输入:
1 | $ sudo nginx -t |
如果一切顺利,你会得到这样的结果:
1 2 3 4 | Output nginx: [warn] "ssl_stapling" ignored, issuer certificate not found nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful |
注意开头的警告。如前所述,这个特定设置会抛出一个警告,因为我们的自签名证书不能使用SSL绑定。这是预期的,我们的服务器仍然可以正确加密连接。
如果输出与上述匹配,则配置文件没有语法错误。我们可以安全地重新启动Nginx来实现我们的更改:
1 | $ sudo systemctl restart nginx |
Nginx进程将重新启动,实现我们配置的SSL设置。
步骤5:测试加密
现在,我们准备测试SSL服务器。
打开网页浏览器,在地址栏输入https://,然后输入服务器的域名或IP:
1 | https://server_domain_or_IP |
因为我们创建的证书不是由您的浏览器的某个受信任的证书颁发机构签名的,所以您可能会看到如下所示的可怕警告:
这是预料之中的,也是正常的。我们只对证书的加密方面感兴趣,而对主机的真实性的第三方验证不感兴趣。点击“高级”,然后提供链接,继续到您的主机:
你应该被带到你的网站。如果您查看浏览器地址栏,您将看到一些部分安全性的指示。这可能是一个上面带有“x”的锁,也可能是一个带有感叹号的三角形。在这种情况下,这仅仅意味着证书不能被验证。它仍然在加密您的连接。
如果将Nginx配置为将HTTP请求重定向到HTTPS,还可以检查重定向函数是否正确:
1 | http://server_domain_or_IP |
如果这导致了相同的图标,这意味着您的重定向工作正确。
结论
您已经将Nginx服务器配置为对客户机连接使用强加密。这将允许您安全地处理请求,并防止外部方读取您的流量。