如何在 CentOS 7 上为 Nginx 创建自签名 SSL 证书

介绍

TLS(Transport Layer Security)和其前身 SSL(Secure Sockets Layer)是用于将正常流量包装到受保护的加密包装中使用的网络协议。

使用这种技术,服务器可以安全地在服务器和客户端之间发送流量,而无需外部人员拦截消息的可能性,证书系统还帮助用户验证他们正在连接的网站的身份。

在本指南中,您将设置一个自签名的 SSL 证书,用于 CentOS 7 服务器上的 Nginx 网页服务器。

注意:**一个自签证书会加密服务器和任何客户端之间的通信,但是,由于它没有被包含在网页浏览器中的任何一个受信任的证书机构签署,用户无法使用该证书自动验证服务器的身份。

由于这种限制,自签证证书不适合为公众服务的生产环境,通常用于测试,或者用于确保单个用户或小组用户使用的非关键服务,这些服务可以通过替代通信渠道建立信任证书的有效性。

对于更多生产准备的证书解决方案,请查看 Let’s Encrypt,一个免费的证书授权机构. 您可以在我们的 设置 Nginx 使用 CentOS 7 上的 Let’s Encrypt 证书教程中学习如何下载和配置 Let’s Encrypt 证书。

前提条件

要完成本教程,你应该有以下内容:

  • 一个 CentOS 服务器具有非根用户配置的)教程中所描述的。

当你准备开始时,登录你的服务器作为你的sudo用户。

第1步:创建SSL证书

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

可以用来保留公共证书的 /etc/ssl/certs 目录应该已经存在于服务器上。 您还需要创建一个 /etc/ssl/private 目录,以保留私钥文件。

1sudo mkdir /etc/ssl/private
2sudo chmod 700 /etc/ssl/private

现在,您可以通过键入单个命令创建一个自签名的密钥和证书对,使用OpenSSL:

1sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/nginx-selfsigned.key -out /etc/ssl/certs/nginx-selfsigned.crt

您将被问到一系列问题. 在谈到这一点之前,让我们看看命令中发生了什么:

*开放 : 这是创建和管理OpenSSL证书,密钥等文件的基本命令行工具. *req : 此子命令指定您想要使用 X. 509 证书签名请求( CSR) 管理 。 "X.509"是SSL和TLS为其密钥和证书管理所遵循的公钥基础设施标准. 您想要创建一个新的 X. 509 证书, 因此您正在使用此子命令 。

  • 联合国 ** -x509 :这进一步修改了上一个子命令,方法是告诉用户您想要制作一个自签名的证书,而不是像通常那样生成证书签名请求. *-节点 :这告诉 OpenSSL 跳过选项,以密码句保护您的证书. 您需要 Nginx 在服务器启动时能够读取文件, 而无需用户干预 。 密码句可以防止这种情况发生,因为每次重启后你都必须输入密码. *天数 365 :此选项设定证书被视为有效的时间长度。 你在这里安排了一年 *-新ersa:2048 : 在此指定您想要同时生成新证书和新密钥 。 您没有在前一个步骤中创建签名证书所需的密钥, 因此您需要随证书一起创建 。 `rsa:2048'部分要求它制作长为2048比特的RSA密钥。 *- keyout :此行告诉 OpenSSL 将您正在创建的生成的私有密钥文件放在哪里 。
  • 联合国 ** 退出 : 这告诉 OpenSSL 您正在创建的证书在哪里 。 .

如上所述,这些选项将创建一个密钥文件和证书,您将被问到一些关于您的服务器的问题,以便正确嵌入证书中的信息。

正确地填写提示。 **最重要的行是请求常用名称(例如服务器FQDN或您的名称)的行。

整个提示将看起来像这样的东西:

1[secondary_label Output]
2Country Name (2 letter code) [XX]:US
3State or Province Name (full name) []:Example
4Locality Name (eg, city) [Default City]:Example 
5Organization Name (eg, company) [Default Company Ltd]:Example Inc
6Organizational Unit Name (eg, section) []:Example Dept
7Common Name (eg, your name or your server's hostname) []:your_domain_or_ip
8Email Address []:[email protected]

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

当你使用OpenSSL时,你还应该创建一个强大的Diffie-Hellman组,用于与客户端谈判 完美向前保密

您可以通过键入这样做:

1sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048

这可能需要几分钟,但一旦完成,您将有一个强大的DH组在/etc/ssl/certs/dhparam.pem,您可以在您的配置中使用。

步骤 2 — 配置 Nginx 使用 SSL

默认的 Nginx 配置在 CentOS 中是相当不结构化的,默认的 HTTP 服务器块住在主配置文件中。

在此目录中,您将创建一个新的文件,以配置服务器块,以使用您生成的证书文件提供内容,然后您可以选择配置默认服务器块,以将 HTTP 请求重定向到 HTTPS。

创建 TLS/SSL 服务器块

/etc/nginx/conf.d目录中创建并打开名为ssl.conf的文件:

1sudo vi /etc/nginx/conf.d/ssl.conf

在内部,首先打开一个服务器块,默认情况下,TLS/SSL连接使用端口443,所以这应该是你的倾听端口。服务器名称应该设置为你在生成证书时使用的服务器域名或IP地址。接下来,使用ssl_certificate,ssl_certificate_keyssl_dhparam指令来设置你生成的SSL文件的位置:

 1[label /etc/nginx/conf.d/ssl.conf]
 2server {
 3    listen 443 http2 ssl;
 4    listen [::]:443 http2 ssl;
 5
 6    server_name your_server_ip;
 7
 8    ssl_certificate /etc/ssl/certs/nginx-selfsigned.crt;
 9    ssl_certificate_key /etc/ssl/private/nginx-selfsigned.key;
10    ssl_dhparam /etc/ssl/certs/dhparam.pem;
11}

接下来,您将添加一些额外的SSL选项,这将增加您的网站的安全性。 您将使用的选项是从 Cipherlist.eu的建议。 本网站旨在为流行的软件提供易于使用的加密设置。

<$>[注] 注:Cipherlist.eu的默认建议设置提供强大的安全性。有时,这会以更大的客户端兼容性为代价。如果您需要支持较旧的客户端,有一个替代列表,可以通过点击标签的链接访问是的,给我一个与传统 / 旧软件一起工作的ciphersuite

您可以使用兼容性列表,而不是上述配置中的默认建议,在两个评论块之间。

您可能想要修改的配置有几个部分,首先,您可以将您偏好的 DNS 解析器添加到解析器指令中,但如果您有其他偏好,您可以更改此指南。

最后,你应该花一会儿阅读在 HTTP 严格运输安全,或 HSTS,特别是关于 [). 重新加载 HSTS 提供了增加的安全性,但如果意外启用或不正确启用,可能会有深远的后果。 在本指南中,你不会提前加载设置,但如果你确定了解后果,你可以更改。

 1[label /etc/nginx/conf.d/ssl.conf]
 2server {
 3    listen 443 http2 ssl;
 4    listen [::]:443 http2 ssl;
 5
 6    server_name your_server_ip;
 7
 8    ssl_certificate /etc/ssl/certs/nginx-selfsigned.crt;
 9    ssl_certificate_key /etc/ssl/private/nginx-selfsigned.key;
10    ssl_dhparam /etc/ssl/certs/dhparam.pem;
11
12    ########################################################################
13    # from https://cipherlist.eu/                                            #
14    ########################################################################
15
16    ssl_protocols TLSv1.3;# Requires nginx >= 1.13.0 else use TLSv1.2
17    ssl_prefer_server_ciphers on;
18    ssl_ciphers EECDH+AESGCM:EDH+AESGCM;
19    ssl_ecdh_curve secp384r1; # Requires nginx >= 1.1.0
20    ssl_session_timeout 10m;
21    ssl_session_cache shared:SSL:10m;
22    ssl_session_tickets off; # Requires nginx >= 1.5.9
23    ssl_stapling on; # Requires nginx >= 1.3.7
24    ssl_stapling_verify on; # Requires nginx => 1.3.7
25    resolver 8.8.8.8 8.8.4.4 valid=300s;
26    resolver_timeout 5s;
27    # Disable preloading HSTS for now. You can use the commented out header line that includes
28    # the "preload" directive if you understand the implications.
29    #add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload";
30    add_header X-Frame-Options DENY;
31    add_header X-Content-Type-Options nosniff;
32    add_header X-XSS-Protection "1; mode=block";
33    ##################################
34    # END https://cipherlist.eu/ BLOCK #
35    ##################################
36}

由于您正在使用自签证书,所以不会使用SSL堆积, Nginx 只会发出警告,禁用自签证证书堆积,并继续正常运作。

最后,为您的网站添加其他 Nginx 配置,这将取决于您的需求而有所不同. 您只会复制一些用于您的示例的默认位置块中的指令,这将设置文档根和一些错误页面:

 1[label /etc/nginx/conf.d/ssl.conf]
 2server {
 3    listen 443 http2 ssl;
 4    listen [::]:443 http2 ssl;
 5
 6    server_name your_server_ip;
 7
 8    ssl_certificate /etc/ssl/certs/nginx-selfsigned.crt;
 9    ssl_certificate_key /etc/ssl/private/nginx-selfsigned.key;
10    ssl_dhparam /etc/ssl/certs/dhparam.pem;
11
12    ########################################################################
13    # from https://cipherlist.eu/                                            #
14    ########################################################################
15
16    . . .
17
18    ##################################
19    # END https://cipherlist.eu/ BLOCK #
20    ##################################
21
22    root /usr/share/nginx/html;
23
24    location / {
25    }
26
27    error_page 404 /404.html;
28    location = /404.html {
29    }
30
31    error_page 500 502 503 504 /50x.html;
32    location = /50x.html {
33    }
34}

当你完成时,保存和退出. 这将配置 Nginx 以使用生成的 SSL 证书来加密流量. 指定的 SSL 选项确保只使用最安全的协议和加密器。

创建从 HTTP 到 HTTPS 的重定向(可选)

有了当前的配置, Nginx 会对端口 443 上的请求用加密内容响应,但对端口 80 上的请求用未加密内容响应,这意味着您的网站提供加密,但不会强制使用。

幸运的是,默认的 Nginx 配置文件允许我们轻松地将指令添加到默认的端口 80 服务器块中,您可以通过在 `ssl.conf' 开始时插入此文:

1[label /etc/nginx/conf.d/ssl.conf]
2server {
3    listen 80;
4    listen [::]:80;
5    server_name your_server_ip;
6    return 301 https://$host$request_uri;
7}
8
9. . .

完成后保存并关闭文件. 此功能将配置端口 80 (默认) 服务器块上的 HTTP 以将收到的请求重定向到您配置的 HTTPS 服务器块。

步骤 3 — 在 Nginx 中启用更改

现在你已经做过更改,你可以重新启动 Nginx 来实现你的新配置。

首先,您应该检查,以确保配置文件中没有语法错误,您可以通过键入:

1sudo nginx -t

如果一切顺利,你会得到一个看起来像这样的结果:

1[secondary_label Output]
2nginx: [warn] "ssl_stapling" ignored, issuer certificate not found
3nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
4nginx: configuration file /etc/nginx/nginx.conf test is successful

如前所述,此特定设置会发出警告,因为自签证证书不能使用SSL堆栈,因此您的服务器仍然可以正确加密连接。

如果您的输出匹配上述,您的配置文件没有语法错误. 您可以安全地重新启动 Nginx 来实现您的更改:

1sudo systemctl restart nginx

Nginx 进程将重新启动,实现您配置的 SSL 设置。

步骤4:测试加密

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

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

1https://server_domain_or_IP

由于您创建的证书不是由您的浏览器的可信证书机构之一签署的,您可能会看到一个可怕的警告,如下面的警告:

Nginx self-signed cert warning

您只对您的证书的加密方面感兴趣,而不是第三方验证您的主机的真实性。 点击ADVANCED,然后提供的链接可以继续到您的主机:

Nginx self-signed override

您应该被带到您的网站. 如果您在浏览器地址栏中查看,您会看到某些部分安全的迹象。这可能是上面有一个x的锁或一个有呼声点的三角形。在这种情况下,这只是意味着证书无法验证。它仍然加密您的连接。

如果您将 Nginx 配置为将 HTTP 请求重定向到 HTTPS,您还可以检查重定向功能是否正确:

1http://server_domain_or_IP

如果这导致相同的图标,这意味着您的重定向工作正确。

结论

您已配置您的 Nginx 服务器以使用强大的加密为客户端连接,这将允许您安全地服务请求,并防止外部人员阅读您的流量。

Published At
Categories with 技术
comments powered by Disqus