如何在 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.2ssl_prefer_server_ciphers on;ssl_ciphers EECDH+AESGCM:EDH+AESGCM;ssl_ecdh_curve secp384r1; # Requires nginx >= 1.1.0ssl_session_timeout  10m;ssl_session_cache shared:SSL:10m;ssl_session_tickets off; # Requires nginx >= 1.5.9ssl_stapling on; # Requires nginx >= 1.3.7ssl_stapling_verify on; # Requires nginx => 1.3.7resolver 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.mzph.cn/pingmian/7994.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深度学习--生成对抗网络GAN

GAN简介 让我们先来简单了解一下GAN GAN的全称是Generative Adversarial Networks,中文称为“生成对抗网络”,是一种在深度学习领域广泛使用的无监督学习方法。 GAN主要由两部分组成:生成器和判别器。生成器的目标是尽可能地生成真实的样本数…

如何创建微信小程序?只需3步完成小程序制作

微信,中国最大的社交媒体应用程序,几个月前推出了微信小程序,这一神奇的功能立即大受欢迎。这些小程序让在中国注册的商业实体所有者创建一个小程序来与微信用户互动。这些小程序不需要在用户手机上进行任何安装,只需通过微信应用…

synchronized工作原理及最佳实践指南

1. synchronized的基本用法与案例分析 1.1. 同步实例方法:对象锁的基本概念 1.1.1. 代码示例:无同步情况下的问题 在没有同步机制的环境下,当多个线程访问同一对象的非同步方法时,会导致资源共享的问题,从而出现数据…

STM32微秒级别延时--F407--TIM1

基本配置: TIM1挂载在APB2总线上,150MHz经过15分频,得到10MHz计数频率,由于disable了自动重装载,所以只需要看下一次计数值是多少即可。 void TIM1_Delay_us(uint16_t us) //使用阻塞方式进行延时,ARR值不…

一次讲透 CSS 背景样式

文章导读:AI 辅助学习前端,包含入门、进阶、高级部分前端系列内容,当前是 CSS 的部分,瑶琴会持续更新,适合零基础的朋友,已有前端工作经验的可以不看,也可以当作基础知识回顾。 CSS 的背景样式…

算法训练营第61天|LeetCode 739. 每日温度 496.下一个更大元素 I

LeetCode 739. 每日温度 题目链接&#xff1a; LeetCode 739. 每日温度 代码&#xff1a; class Solution { public:vector<int> dailyTemperatures(vector<int>& temperatures) {stack<int>st;int size temperatures.size();vector<int>resu…

解决the --read-only option so it cannot execute this statement

程序报错如下&#xff1a; Caused by: org.springframework.jdbc.UncategorizedSQLException: StatementCallback; uncategorized SQLException for SQL [DELETE FROM S_P_USER_Y WHERE Y 2024 ]; SQL state [HY000]; error code [1290]; The MySQL server is running wit…

day23-等差数列划分

问题描述&#xff1a; 如果一个数列 至少有三个元素 &#xff0c;并且任意两个相邻元素之差相同&#xff0c;则称该数列为等差数列。 例如&#xff0c;[1,3,5,7,9]、[7,7,7,7] 和 [3,-1,-5,-9] 都是等差数列。 给你一个整数数组 nums &#xff0c;返回数组 nums 中所有为等差…

【C 数据结构-动态内存管理】4. 无用单元收集(垃圾回收机制)

文章目录 【 1. 问题描述与解决方法 】【 2. 中断回收机制 】 【 1. 问题描述与解决方法 】 问题描述 动态存储管理的运行机制可以概括为&#xff1a;当用户发出申请空间的请求后&#xff0c;系统向用户分配内存&#xff1b;用户运行结束释放存储空间后&#xff0c;系统回收内…

Fizzler库+C#:从微博抓取热点的最简单方法

概述 在这篇技术文章中&#xff0c;我们将深入研究如何利用Fizzler库结合C#语言&#xff0c;以实现从微博平台抓取热点信息的功能。微博作为中国乃至全球范围内具有重要影响力的社交媒体平台之一&#xff0c;在互联网信息传播中扮演着举足轻重的角色。通过Fizzler这一强大的.N…

Pytorch 实现情感分析

情感分析 情感分析是 NLP 一种应用场景&#xff0c;模型判断输入语句是积极的还是消极的&#xff0c;实际应用适用于评论、客服等多场景。情感分析通过 transformer 架构中的 encoder 层再加上情感分类层进行实现。 安装依赖 需要安装 Poytorch NLP 相关依赖 pip install t…

JVM学习笔记【基础篇:垃圾回收】

自动垃圾回收 C/C的内存管理 ⚫ 在C/C这类没有自动垃圾回收机制的语言中&#xff0c;一个对象如果不再使用&#xff0c;需要手动释放&#xff0c;否则就会出现 内存泄漏。我们称这种释放对象的过程为垃圾回收&#xff0c;而需要程序员编写代码进行回收的方式为手动回收。 ⚫ …

RTT潘多拉开发板上实现电源管理

简介 随着物联网(IoT)的兴起&#xff0c;产品对功耗的需求越来越强烈。作为数据采集的传感器节点通常需要在电池供电时长期工作&#xff0c;而作为联网的SOC也需要有快速的响应功能和较低的功耗。 在产品开发的起始阶段&#xff0c;首先考虑是尽快完成产品的功能开发。在产品…

数仓开发中期:理论巩固

一、数仓以及商业智能&#xff08;Data Warehousing and Business Intelligence, DW/BI&#xff09;系统 1.1数据操作和数据获取的区别 对所有组织来说&#xff0c;信息都是其最重要的财富之一。信息几乎总是用作两个目的:操作型记录的保存和分析型决策的制定。简单来说&…

Stack数据结构设计模板

第三章 栈、队列、数组 1.栈 1.1 顺序栈 #define MaxSize 20 typedef int ElemType; //顺序栈的定义 typedef struct {ElemType data[MaxSize];int top; }SqStack; // 初始化顺序栈 void InitSqStack(SqStack &S){S.top -1; }; // 入栈(增) bool Push(SqStack &S,El…

(非常全)前后端分离架构的优势

前后端分离架构在现代Web应用开发中变得越来越流行&#xff0c;它具有许多优势&#xff1a; 职责划分清晰&#xff1a;前后端分离使得前端专注于用户界面和交互&#xff0c;后端专注于业务逻辑和数据处理。这种职责划分有助于提高开发效率&#xff0c;降低维护成本。 开发效率…

WIFI模块UDP电脑端调试

一&#xff0c;两端都是电脑端 1&#xff0c;电脑本机的IP地址 192.168.137.1 2&#xff0c;新建两个不同的连接&#xff0c;注意端口 二&#xff0c;WIFI 模块和电脑端连接 1&#xff0c;设置模块端目标IP和端口&#xff0c;电脑端只接收数据的话&#xff0c;IP、端口可随…

自建的 npm 仓库上发布包

要在自建的 npm 仓库上发布包&#xff0c;你需要按照以下步骤操作&#xff1a; 1. 设置 npm 仓库地址 首先&#xff0c;确保你已经将 npm 配置为使用你的自建仓库。你可以通过以下命令将 npm registry 配置为你的仓库地址&#xff1a; npm config set registry <your-reg…

【从零开始学架构 架构基础】架构设计的本质、历史背景和目的

本文是《从零开始学架构》的第一篇学习笔记&#xff0c;主要理解架构的设计的本质定义、历史背景以及目的。 架构设计的本质 分别从三组概念的区别来理解架构设计。 系统与子系统 什么是系统&#xff0c;系统泛指由一群有关联的个体组成&#xff0c;根据某种规则运作&#…

企业终端安全管理软件有哪些?终端安全管理软件哪个好?

终端安全的重要性大家众所周知&#xff0c;关系到生死存亡的东西。 各类终端安全管理软件应运而生&#xff0c;为企业提供全方位、多层次的终端防护。 有哪些企业终端安全管理软件&#xff1f; 一、主流企业终端安全管理软件 1. 域智盾 域智盾是一款专为企业打造的全面终端…