如何在 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 目录,用于保存私钥文件。由于此密钥的保密对于安全性至关重要,因此重要的是要锁定权限,以防止未经授权的访问:

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

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

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

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

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 文件的位置:

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 来实施新的配置。

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

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 以实施更改:

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 服务器以为客户端连接使用强加密。这将允许您安全地提供请求,并防止外部方读取您的流量。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/602079.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

前端如何设置div可滚动,且设置滚动条颜色

在前端中,设置 div 为可滚动并通过 CSS 自定义滚动条的颜色并不是所有浏览器都直接支持的功能,因为滚动条的样式在很大程度上取决于操作系统和浏览器的默认样式。然而,你可以使用某些 CSS 属性来尝试自定义滚动条的外观,这些属性在…

JavaEE概述 + Maven

文章目录 一、JavaEE 概述二、工具 --- Maven2.1 Maven功能 仓库 坐标2.2 Maven之项目构建2.3 Maven之依赖管理 三、插件 --- Maven Helper 一、JavaEE 概述 Java SE、JavaEE: Java SE:指Java标准版,适用于各行各业,主要是Java…

2024 Flutter 一季度热门 issue/roadmap 进展和个人感触闲聊

因为最近的《Flutter:听说你最近到处和人说我解散了?》相关事件之后,不少人对于目前 Flutter 的一些进度情况比较关心,刚好这里做一个简要汇总,报告几个过去一季度相关的热门 issue/roadmap 情况,另外这些天…

邮件群发系统的效率怎么样?如何评估性能?

邮件群发系统的使用方法?邮件群发工具的关键功能? 邮件群发系统已成为企业、组织及个人进行信息沟通的重要工具。然而,当我们谈论邮件群发系统的效率时,我们需要从多个维度来全面分析和评估。AokSend就来介绍一下。 邮件群发系统…

ReactFlow的ReactFlow实例事件传参undefined处理状态切换

1.问题 ReactFlow的ReactFlow实例有些事件我们在不同的状态下并不需要,而且有时候传参会出现其它渲染效果,比如只读状态下我们不想要拖拉拽onEdgesChange连线重连或删除的功能。 2.思路 事件名称类型默认值onEdgesChange(changes: EdgeChange[]) >…

AI大模型探索之路-训练篇17:大语言模型预训练-微调技术之QLoRA

系列篇章💥 AI大模型探索之路-训练篇1:大语言模型微调基础认知 AI大模型探索之路-训练篇2:大语言模型预训练基础认知 AI大模型探索之路-训练篇3:大语言模型全景解读 AI大模型探索之路-训练篇4:大语言模型训练数据集概…

浅谈消息队列和云存储

1970年代末,消息系统用于管理多主机的打印作业,这种削峰解耦的能力逐渐被标准化为“点对点模型”和稍复杂的“发布订阅模型”,实现了数据处理的分布式协同。随着时代的发展,Kafka,Amazon SQS,RocketMQ&…

基于大数据+Hadoop的豆瓣电子图书推荐系统实现

🌹作者主页:青花锁 🌹简介:Java领域优质创作者🏆、Java微服务架构公号作者😄 🌹简历模板、学习资料、面试题库、技术互助 🌹文末获取联系方式 📝 系列文章目录 基于大数…

组合模式(Composite)——结构型模式

组合模式(Composite)——结构型模式 组合模式是一种结构型设计模式, 你可以使用它将对象组合成树状结构, 并且能通过通用接口像独立整体对象一样使用它们。如果应用的核心模型能用树状结构表示, 在应用中使用组合模式才有价值。 例如一个场景…

新能源汽车充电站智慧充电电能服务综合解决方案

安科瑞薛瑶瑶18701709087/17343930412 ★解决方案 ✔目的地充电-EMS微电网平台 基于EMS解决方案从设备运维的角度解决本地充电的能量管理及运维问题,与充电管理平台打通数据,为企业微电网提供源、网、荷、储、充一体化解决方案。 ✔运营场站--电能服务…

​「Python绘图」绘制太极图

python 绘制太极 一、预期结果 二、核心代码 import turtlepen turtle.Turtle()print("开始绘制太极")radius 100 pen.color("black", "black") pen.begin_fill() pen.circle(radius/2, 180) pen.circle(radius, 180) pen.left(180) pen.circ…

英语口语情景对话视频软件分享!

在当今全球化的时代,英语已成为一种通用的国际语言。为了提高英语口语能力,越来越多的人选择使用英语口语情景对话视频软件。本文将为您推荐几款备受欢迎的英语口语情景对话视频软件,帮助您轻松提高英语口语水平。 AI外语陪练 AI外语陪练软件…

营养补充品软胶囊:弹性测试与市场表现的深度解析

营养补充品软胶囊:弹性测试与市场表现的深度解析 在追求健康生活的时代,营养补充品市场蓬勃发展,其中软胶囊作为一种方便、易吸收的剂型,受到了消费者的广泛欢迎。然而,在这个竞争激烈的市场中,如何确保产…

推荐5个AI工具平替GPT

随着AI技术的快速发展,AI写作正成为创作的新风口。但是面对GPT-4这样的国际巨头,国内很多小伙伴往往望而却步,究其原因,就是它的使用门槛高,还有成本的考量。 不过,随着GPT技术的火热,国内也涌…

window11事件查看器中“在事件中只要触发此事件,就会执行相关非XX.xml脚本”

在事件中只要触发此事件,就会执行相关非XX.xml脚本 一、操作过程 1、在时间查看器中,将任务附加到此事件上 2、按照提示逐步下一步添加完成 3、只要触发1中的事件,那么就会执行对应的关联脚本xx.xml。 二、解决办法 1、通过开始菜单搜索打…

riscv交叉编译ports软件@FreeBSD15

当前FreeBSD的riscv版本下,软件包还很贫乏,再加上RISCV的板子有很多种,大部分时候都需要自己动手编译。但是在RISCV环境下编译太慢了,所以我们要使用交叉编译,在很快的AMD64服务器上交叉编译RISCV的软件包。 这里使用…

Promise魔鬼面试题

文章目录 题目解析难点分析分析输出step1step2step3step4step5step6 参考/致谢:渡一袁老师 题目 Promise.resolve().then(() > {console.log(0);return Promise.resolve(4);}).then((res) > {console.log(res);});Promise.resolve().then(() > {console.l…

基于FPGA的数字信号处理(10)--定点数的舍入模式(1)四舍五入round

1、前言 将浮点数定量化为定点数时,有一个避不开的问题:某些小数是无法用有限个数的2进制数来表示的。比如: 0.5(D) 0.1(B) 0.1(D) 0.0001100110011001~~~~(B) 可以看到0.5是可以精准表示的,但是0.1却不行。原因是整数是离散的…

AngusTester安装请求代理

一、介绍 请求代理程序(AngusProxy)提供两个方面作用: 代理Http和WebSocket协议接口调试请求,解决浏览器跨域限制问题。对代理请求客户化处理支持,允许用户对代理请求进行二次处理,如:请求参数签名。 二、类型 为了…

【经验01】spark执行离线任务的一些坑

项目背景: 目前使用spark跑大体量的数据,效率还是挺高的,机器多,120多台的hadoop集群,还是相当的给力的。数据大概有10T的量。 最近在出月报数据的时候发现有一个任务节点一直跑不过去,已经超过失败次数的阈值,报警了。 预警很让人头疼,不能上班摸鱼了。 经过分析发现…
最新文章