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

来自菜鸟教程
跳转至:导航、​搜索

介绍

TLS 或传输层安全性及其前身 SSL 代表安全套接字层,是用于将正常流量包装在受保护的加密包装器中的 Web 协议。

使用这项技术,服务器可以在服务器和客户端之间安全地发送流量,而不会被外界截获消息。 证书系统还帮助用户验证他们正在连接的站点的身份。

在本指南中,您将设置一个自签名 SSL 证书,以便在 CentOS 7 服务器上与 Nginx Web 服务器一起使用。

注意: 自签名证书将加密您的服务器和任何客户端之间的通信。 但是,由于它没有由 Web 浏览器中包含的任何受信任的证书颁发机构签名,因此用户无法使用该证书自动验证您的服务器的身份。 因此,用户在访问您的网站时会看到安全错误。

由于此限制,自签名证书不适用于为公众服务的生产环境。 它们通常用于测试或保护由单个用户或一小组用户使用的非关键服务,这些用户可以通过备用通信渠道建立对证书有效性的信任。

如需更适合生产的证书解决方案,请查看免费证书颁发机构 Let's Encrypt。 您可以在我们的 在 CentOS 7 上使用 Let's Encrypt 证书设置 Nginx 教程中了解如何下载和配置 Let's Encrypt 证书。


先决条件

要完成本教程,您应该具备以下条件:

  • 一个非 root 用户配置了 sudo 权限的 CentOS 服务器,如 CentOS 7 教程的 初始服务器设置中所述。
  • 安装在服务器上的 Nginx,如 如何在 CentOS 7 上安装 Nginx 中所述。

当您准备好开始时,以您的 sudo 用户身份登录到您的服务器。

第 1 步 — 创建 SSL 证书

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

可用于保存公共证书的 /etc/ssl/certs 目录应该已经存在于服务器上。 您还需要创建一个 /etc/ssl/private 目录来保存私钥文件。 由于此密钥的保密性对于安全性至关重要,因此锁定权限以防止未经授权的访问非常重要:

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

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

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 地址。

整个提示将如下所示:

OutputCountry 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 组,用于与客户端协商 Perfect Forward Secrecy

您可以通过键入以下内容来执行此操作:

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

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

第 2 步 — 配置 Nginx 以使用 SSL

CentOS 中默认的 Nginx 配置相当非结构化,默认的 HTTP 服务器块位于主配置文件中。 Nginx 会在 /etc/nginx/conf.d 目录中检查以 .conf 结尾的文件以进行额外配置。

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

创建 TLS/SSL 服务器块

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

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

在里面,首先打开一个 server 块。 默认情况下,TLS/SSL 连接使用端口 443,因此应该是您的 listen 端口。 server_name 应设置为您在生成证书时用作公用名的服务器的域名或 IP 地址。 接下来,使用 ssl_certificatessl_certificate_keyssl_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 选项,以提高您网站的安全性。 您将使用的选项是来自 Cipherlist.eu 的建议。 该站点旨在为流行软件提供易于使用的加密设置。

注意: Cipherlist.eu 上的默认建议设置提供了强大的安全性。 有时,这是以更高的客户端兼容性为代价的。 如果您需要支持老客户,可以通过单击标有“是的,给我一个适用于旧版/旧软件的密码套件”的链接访问一个替代列表。

可以在两个注释块之间使用兼容性列表代替上述配置中的默认建议。 您使用哪种配置的选择很大程度上取决于您需要支持什么。


您可能希望修改一些配置。 首先,您可以将上游请求的首选 DNS 解析器添加到 resolver 指令。 您在本指南中使用了 Google,但如果您有其他偏好,可以更改此设置。

最后,您应该花点时间阅读 HTTP Strict Transport Security 或 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 页面,因此您可能需要对其进行修改以满足您的需要。

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

使用您当前的配置,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 服务器块。

第 3 步 — 启用 Nginx 中的更改

现在您已经进行了更改,您可以重新启动 Nginx 以实现您的新配置。

首先,您应该检查以确保配置文件中没有语法错误。 您可以通过键入以下内容来执行此操作:

sudo nginx -t

如果一切顺利,您将得到如下所示的结果:

Outputnginx: [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 以实施您的更改:

sudo systemctl restart nginx

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

第 4 步 — 测试加密

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

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

https://server_domain_or_IP

由于您创建的证书未由浏览器的受信任证书颁发机构之一签名,因此您可能会看到一个看起来很吓人的警告,如下所示:

这是预期和正常的。 您只对证书的加密方面感兴趣,而不是对主机真实性的第三方验证。 单击“高级”,然后单击提供的链接以继续访问您的主机:

您应该被带到您的网站。 如果您查看浏览器地址栏,您会看到一些部分安全的迹象。 这可能是一个带有“x”的锁或带有感叹号的三角形。 在这种情况下,这仅意味着无法验证证书。 它仍在加密您的连接。

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

http://server_domain_or_IP

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

结论

您已将 Nginx 服务器配置为对客户端连接使用强加密。 这将使您能够安全地处理请求,并防止外部各方读取您的流量。