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

简介

TLS ,即传输层安全性,及其前身SSL,即安全套接字层,是用于将普通流量包装在受保护的加密包中的网络协议。

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

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

先决条件

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

  • 配置了具有 sudo 权限的非根用户的 CentOS 服务器,如《CentOS 7 初始服务器设置》中所述。
  • 在服务器上安装了 Nginx,如《如何在 CentOS 7 上安装 Nginx》中所述。

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

步骤 1 --- 创建 SSL 证书

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

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

command 复制代码
sudo mkdir /etc/ssl/private
sudo chmod 700 /etc/ssl/private

现在,您可以通过在终端中输入以下命令,使用 OpenSSL 一次性创建自签名密钥和证书对:

command 复制代码
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 地址。

提示的全部内容将如下所示:

复制代码
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 组,用于与客户端协商完美前向保密。

您可以通过输入以下命令来执行此操作:

command 复制代码
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 的文件:

command 复制代码
sudo vi /etc/nginx/conf.d/ssl.conf

在其中,首先打开一个 server 块。默认情况下,TLS/SSL 连接使用端口 443,因此这应该是您的 listen 端口。server_name 应设置为您在生成证书时用作通用名称的服务器域名或 IP 地址。接下来,使用 ssl_certificatessl_certificate_keyssl_dhparam 指令来设置您生成的 SSL 文件的位置:

复制代码
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 的建议。该网站旨在为流行软件提供易于消化的加密设置。

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

最后,您应该花一点时间了解 HTTP 严格传输安全性(HSTS),特别是关于"preload"功能。预加载 HSTS 可以提供增强的安全性,但如果意外启用或错误启用,可能会产生深远的后果。在本指南中,您不会预加载这些设置,但如果您确信理解了其影响,可以进行修改。

复制代码
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 stapling。Nginx 将简单地输出警告,为您的自签名证书禁用 stapling,并继续正常运行。

最后,添加您站点的其余 Nginx 配置。这将根据您的需求而有所不同。您只需复制默认位置块中使用的一些指令,这将设置文档根目录和一些错误页面:

复制代码
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 的开头插入以下内容来实现:

复制代码
server {
    listen 80;
    listen [::]:80;
    server_name your_server_ip;
    return 301 https://$host$request_uri;
}

. . .

完成后保存并关闭文件。这将配置端口 80(默认)的 HTTP 服务器块,将传入请求重定向到您配置的 HTTPS 服务器块。

步骤 3 ------ 启用 Nginx 中的更改

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

首先,您应该检查配置文件中是否存在语法错误。您可以通过输入以下命令来执行此操作:

command 复制代码
sudo nginx -t

如果一切顺利,您将会得到以下类似的结果:

复制代码
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 stapling,因此此特定设置会引发警告。这是预期的,您的服务器仍然可以正确加密连接。

如果您的输出与上述内容匹配,则您的配置文件没有语法错误。您可以安全地重新启动 Nginx 以实施更改:

command 复制代码
sudo systemctl restart nginx

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

步骤 4 ------ 测试加密

现在,您可以测试您的 SSL 服务器了。

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

复制代码
https://server_domain_or_IP

由于您创建的证书未经您浏览器信任的证书颁发机构签名,您可能会看到类似下面的警告:

!Nginx self-signed cert warning

这是预期的和正常的。您只关心证书的加密方面,而不是主机真实性的第三方验证。点击"高级"然后点击提供的链接以继续访问您的主机:

!Nginx self-signed override

您应该能够访问您的站点。如果您查看浏览器地址栏,您将看到部分安全性的指示。这可能是一个带有"x"的锁定图标,或者带有感叹号的三角形。在这种情况下,这只是意味着无法验证证书。它仍然在加密您的连接。

如果您配置了 Nginx 将 HTTP 请求重定向到 HTTPS,您还可以检查重定向是否正常工作:

复制代码
http://server_domain_or_IP

如果结果显示相同的图标,这意味着您的重定向已经正常工作。

结论

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

相关推荐
XMYX-02 小时前
解决 Apache/WAF SSL 证书链不完整导致的 PKIX path building failed 问题
网络协议·apache·ssl
川石课堂软件测试10 小时前
Oracle 数据库:视图与索引
数据库·网络协议·nginx·http·oracle·grafana·prometheus
小妖66611 小时前
mac 安装 nginx
运维·nginx·macos
Whitess00711 小时前
Websocket链接如何配置nginx转发规则?
websocket·网络协议·nginx
if时光重来20 小时前
springboot项目使用websocket功能,使用了nginx反向代理后连接失败问题解决
spring boot·websocket·nginx
xiaozhenghahaha21 小时前
Web相关知识(草稿)
运维·nginx
柯南二号1 天前
【后端】Docker 常用命令详解
服务器·nginx·docker·容器
工会代表1 天前
nginx配置,将前端项目配置到子路径下踩过的坑。
前端·nginx
少陽君1 天前
什么是CA根证书
服务器·https·ssl
云霄IT1 天前
CentOS7安装Nginx服务——为你的网站配置https协议和自定义服务端口
服务器·nginx·https