TLS,或传输层安全,及其前身SSL代表安全套接字层,是用于将正常流量包装在受保护的加密包装器中的 Web 协议。
使用此技术,服务器可以在服务器和客户端之间安全地发送流量,而不会出现消息被外部各方拦截的可能性。证书系统还帮助用户验证他们所连接的站点的身份。
在本指南中,您将设置一个自签名 SSL 证书,以便与 CentOS 7 服务器上的 Nginx Web 服务器一起使用。
Note:自签名证书将加密您的服务器和任何客户端之间的通信。但是,由于它没有由 Web 浏览器中包含的任何受信任的证书颁发机构签名,因此用户无法使用该证书自动验证服务器的身份。因此,用户在访问您的网站时会看到安全错误。
由于此限制,自签名证书不适合为公众服务的生产环境。它们通常用于测试或保护单个用户或一小群用户使用的非关键服务,这些用户可以通过备用通信渠道建立对证书有效性的信任。
如需更适合生产的证书解决方案,请查看让我们加密,一个免费的证书颁发机构。您可以在我们的网站中了解如何下载和配置 Let’s Encrypt 证书在 CentOS 7 上使用 Let’s Encrypt 证书设置 Nginx教程。
要完成本教程,您应该具备以下条件:
- 具有非 root 用户配置的 CentOS 服务器
sudo
中描述的特权CentOS 7 的初始服务器设置教程。
- 服务器上安装Nginx,如下所述如何在 CentOS 7 上安装 Nginx.
当您准备好开始时,请以您的身份登录到您的服务器sudo
user.
TLS/SSL 通过使用公共证书和私钥的组合来工作。 SSL 密钥在服务器上保密。它用于加密发送给客户端的内容。 SSL 证书与请求该内容的任何人公开共享。它可用于解密由关联的 SSL 密钥签名的内容。
The /etc/ssl/certs
服务器上应该已经存在可用于保存公共证书的目录。您将需要创建一个/etc/ssl/private
目录也是如此,用于保存私钥文件。由于此密钥的保密对于安全至关重要,因此锁定权限以防止未经授权的访问非常重要:
-
sudo mkdir/etc/ssl/私有
-
sudo chmod 700/etc/ssl/私有
现在,您可以通过键入以下命令在单个命令中使用 OpenSSL 创建自签名密钥和证书对:
-
sudoopenssl 请求-x509 -nodes -days 365 -newkeyRSA: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 能够读取该文件,而无需用户干预。密码可以防止这种情况发生,因为每次重新启动后都必须输入密码。
-
-第365天:此选项设置证书被视为有效的时间长度。你在这里设置了一年。
-
-newkey rsa:2048:这指定您要同时生成新证书和新密钥。您没有在上一步中创建签署证书所需的密钥,因此您需要将其与证书一起创建。这
rsa:2048
部分告诉它创建一个 2048 位长的 RSA 密钥。
-
-keyout:此行告诉 OpenSSL 将您正在创建的生成的私钥文件放置在哪里。
-
-out:这告诉 OpenSSL 将您正在创建的证书放置在哪里。
如上所述,这些选项将创建密钥文件和证书。系统将询问您一些有关服务器的问题,以便将信息正确嵌入到证书中。
正确填写提示。最重要的一行是请求Common Name (e.g. server FQDN or YOUR name)
。您需要输入与您的服务器关联的域名或服务器的公共 IP 地址。
整个提示将如下所示:
Output
Country Name (2 letter code) [XX]:US
State or Province Name (full name) []:Example
Locality Name (eg, city) [Default City]:Example
Organization Name (eg, company) [Default Company Ltd]:Example Inc
Organizational Unit Name (eg, section) []:Example Dept
Common Name (eg, your name or your server's hostname) []:your_domain_or_ip
Email Address []:webmaster@example.com
您创建的两个文件都将放置在相应的子目录中/etc/ssl
目录。
当您使用 OpenSSL 时,您还应该创建一个强大的 Diffie-Hellman 组,用于协商完美的前向保密与客户。
您可以通过键入以下内容来执行此操作:
-
sudoopenssl dhparam-out/etc/ssl/certs/dhparam.pem2048
这可能需要几分钟,但完成后您将拥有一个强大的 DH 小组/etc/ssl/certs/dhparam.pem
您可以在您的配置中使用它。
CentOS 中的默认 Nginx 配置相当非结构化,默认 HTTP 服务器块位于主配置文件中。 Nginx 将检查以以下结尾的文件.conf
in the /etc/nginx/conf.d
用于附加配置的目录。
您将在此目录中创建一个新文件来配置使用您生成的证书文件提供内容的服务器块。然后,您可以选择配置默认服务器块以将 HTTP 请求重定向到 HTTPS。
创建并打开一个名为ssl.conf
in the /etc/nginx/conf.d
目录:
-
sudo vi/etc/nginx/conf.d/ssl.conf
在里面,首先打开一个server
堵塞。默认情况下,TLS/SSL 连接使用端口 443,因此这应该是您的listen
港口。这server_name
应设置为您在生成证书时用作通用名称的服务器的域名或 IP 地址。接下来,使用ssl_certificate
, ssl_certificate_key
, and ssl_dhparam
指令设置您生成的 SSL 文件的位置:
/etc/nginx/conf.d/ssl.conf
server {
listen 443 http2 ssl;
listen [::]:443 http2 ssl;
server_name your_server_ip;
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 选项,以提高站点的安全性。您将使用的选项是来自的建议密码列表.eu。该网站旨在为流行软件提供易于使用的加密设置。
Note:默认建议设置为密码列表.eu提供强大的安全保障。有时,这是以提高客户端兼容性为代价的。如果您需要支持较旧的客户端,可以通过单击标有“是的,给我一个适用于旧版/旧软件的密码套件”的链接来访问替代列表。
可以在两个注释块之间使用兼容性列表来代替上述配置中的默认建议。选择使用哪种配置很大程度上取决于您需要支持的内容。
您可能希望修改一些配置。首先,您可以将上游请求的首选 DNS 解析器添加到resolver
指示。您在本指南中使用了 Google,但如果您有其他偏好,则可以更改此设置。
最后,您应该花点时间阅读HTTP 严格传输安全(HSTS),特别是关于“预加载”功能。预加载 HSTS 可提高安全性,但如果意外启用或错误启用,可能会产生深远的后果。在本指南中,您不会预加载设置,但如果您确定了解其含义,则可以对其进行修改。
/etc/nginx/conf.d/ssl.conf
server {
listen 443 http2 ssl;
listen [::]:443 http2 ssl;
server_name your_server_ip;
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://cipherlist.eu/ #
########################################################################
ssl_protocols TLSv1.3;# Requires nginx >= 1.13.0 else use TLSv1.2
ssl_prefer_server_ciphers on;
ssl_ciphers EECDH+AESGCM:EDH+AESGCM;
ssl_ecdh_curve secp384r1; # Requires nginx >= 1.1.0
ssl_session_timeout 10m;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off; # Requires nginx >= 1.5.9
ssl_stapling on; # Requires nginx >= 1.3.7
ssl_stapling_verify on; # Requires nginx => 1.3.7
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 X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";
##################################
# END https://cipherlist.eu/ BLOCK #
##################################
}
由于您使用的是自签名证书,因此不会使用 SSL 装订。 Nginx 将简单地输出警告,禁用自签名证书的装订,并继续正确运行。
最后,为您的站点添加其余的 Nginx 配置。这将根据您的需求而有所不同。您只需复制示例的默认位置块中使用的一些指令,这将设置文档根目录和一些错误页面:
/etc/nginx/conf.d/ssl.conf
server {
listen 443 http2 ssl;
listen [::]:443 http2 ssl;
server_name your_server_ip;
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://cipherlist.eu/ #
########################################################################
. . .
##################################
# END https://cipherlist.eu/ 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 页面,因此您可能需要修改它以满足您的需求。
根据您当前的配置,Nginx 对端口 443 上的请求以加密内容进行响应,但对端口 80 上的请求以未加密内容进行响应。这意味着您的站点提供加密,但不强制使用它。这对于某些用例来说可能没问题,但通常最好要求加密。当密码等机密数据可能在浏览器和服务器之间传输时,这一点尤其重要。
值得庆幸的是,默认的 Nginx 配置文件允许我们轻松地将指令添加到默认端口 80 服务器块。您可以通过将其插入到开头来完成此操作ssl.conf
:
/etc/nginx/conf.d/ssl.conf
server {
listen 80;
listen [::]:80;
server_name your_server_ip;
return 301 https://$host$request_uri;
}
. . .
完成后保存并关闭文件。这将配置端口 80(默认)服务器块上的 HTTP,以将传入请求重定向到您配置的 HTTPS 服务器块。
现在您已经进行了更改,您可以重新启动 Nginx 来实施新配置。
首先,您应该检查以确保配置文件中没有语法错误。您可以通过键入以下内容来执行此操作:
如果一切成功,您将得到如下所示的结果:
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 以实施您的更改:
Nginx 进程将重新启动,实施您配置的 SSL 设置。
现在,您已准备好测试您的 SSL 服务器。
打开您的网络浏览器并输入https://
然后在地址栏中输入您服务器的域名或 IP:
https://server_domain_or_IP
由于您创建的证书不是由浏览器受信任的证书颁发机构之一签署的,因此您可能会看到如下所示的可怕警告:
这是预期的且正常的。您只对证书的加密方面感兴趣,而不对主机真实性的第三方验证感兴趣。单击“高级”,然后单击提供的链接继续访问您的主机:
您应该被带到您的网站。如果您查看浏览器地址栏,您会看到一些部分安全的指示。这可能是一个上面带有“x”的锁或带有感叹号的三角形。在这种情况下,这仅意味着无法验证证书。它仍在加密您的连接。
如果您配置了 Nginx 将 HTTP 请求重定向到 HTTPS,您还可以检查重定向功能是否正常:
http://server_domain_or_IP
如果这导致相同的图标,则意味着您的重定向工作正常。
您已将 Nginx 服务器配置为对客户端连接使用强加密。这将使您能够安全地处理请求,并防止外部各方读取您的流量。