SSL 自定义证书创建过程
1、生成自签名根证书和私钥
1.1 生成根证书
1.1.1生成根证书私钥
首先,生成一个自签名的根证书和私钥。这个根证书将作为信任锚(Trust Anchor),客户端会信任由这个根证书签署的所有证书。
openssl genrsa -out rootCA.key 2048
参数解释:
openssl
: OpenSSL工具的主命令。genrsa
: 生成RSA密钥对的命令。-out rootCA.key
: 指定输出文件名为rootCA.key
,这是生成的私钥文件。2048
: 指定密钥的长度为2048位。
1.2 生成根证书
创建openssl.cnf 文件,文件内容如下:
[ req ]
default_bits = 2048
default_keyfile = rootCA.key
distinguished_name = req_distinguished_name
prompt = no
[ req_distinguished_name ]
C = CN
ST = Shanghai
L = Shanghai
O = CodeProject
OU = Development
CN = CodeProject Root CA
1.2.1生成根证书rootCA.crt
命令如下:
openssl req -x509 -new -nodes -key rootCA.key -sha256 -days 36500 -out rootCA.crt -config openssl.cnf
解释
-x509
:表示生成自签名证书(而不是证书签名请求)。-new
:表示生成新证书。-nodes
:表示不加密私钥文件(即不需要密码保护)。-key rootCA.key
:指定私钥文件为rootCA.key
。-sha256
:使用SHA-256哈希算法。-days 36500
:指定证书的有效期为36500天(约100年)。-out rootCA.crt
:指定输出的证书文件名为rootCA.crt
。-config openssl.cnf
:指定使用openssl.cnf
配置文件中的信息。
1.3为什么根证书不要CSR 文件
在生成根证书(Root CA 证书)时,不需要 CSR(证书签名请求)文件,这是因为根证书是自签名的。具体来说,根证书的生成过程和普通证书不同,以下是详细解释:
什么是根证书?
根证书是公钥基础设施(PKI)中的顶级证书,它用来签署其他证书,包括中间证书和最终用户证书。根证书通常由证书颁发机构(CA)生成和自签名。
自签名证书和CSR的区别
1. 自签名证书
自签名证书是由自身私钥签名的证书。因为它是信任链的起点,所以不需要外部的证书颁发机构(CA)来签署。这就是为什么在生成根证书时不需要 CSR 文件的原因。
生成自签名根证书的过程如下:
- 生成一对密钥(公钥和私钥)。
- 使用私钥签署生成的证书。
2. 生成服务端证书
2.1生成服务端私钥
openssl genrsa -out server.key 2048
创建OpenSSL配置文件
创建一个名为openssl.cnf
的文件,并添加以下内容:
[ req ]
default_bits = 2048
default_keyfile = server.key
distinguished_name = req_distinguished_name
prompt = no[ req_distinguished_name ]
C = CN
ST = Shanghai
L = Shanghai
O = CodeProject
OU = Development
CN = example.com
生成CSR
确保server.key
文件和openssl.cnf
文件在同一个目录下,然后运行以下命令:
openssl req -new -config openssl.cnf -key server.key -out server.csr
使用根证书签署服务端证书
openssl x509 -req -in server.csr -CA rootCA.crt -CAkey rootCA.key -CAcreateserial -out server.crt -days 365 -sha256
参数解释:
x509
: 用于处理X.509证书的命令。-req
: 表示输入是一个证书签名请求(CSR)。-in server.csr
: 指定输入文件名为server.csr
,这是前面生成的CSR文件。-CA rootCA.crt
: 指定用作CA的根证书文件rootCA.crt
。-CAkey rootCA.key
: 指定用于签署的根证书私钥文件rootCA.key
。-CAcreateserial
: 如果没有rootCA.srl
文件,创建一个新的序列号文件。-out server.crt
: 指定输出文件名为server.crt
,这是生成的服务端证书。-days 365
: 证书的有效期为365天(1年)。-sha256
: 使用SHA-256哈希算法。
类比解释:信任关系
假设有一个大公司(根证书),公司里有一个高管(服务端证书),还有许多员工(客户端)。公司决定了一套信任规则来管理所有员工的工作和身份验证。
-
大公司发布了自己的信任凭证(根证书):
- 大公司自己发布了一个“公司章”(自签名证书),所有员工都认可这个公司章。
- 这个公司章表示大公司本身是可信的,不需要别人来验证它,因为所有人都知道它并信任它。
-
高管获得了公司的信任凭证(服务端证书):
- 高管需要一个身份验证(服务端证书),于是公司用自己的公司章给高管发布了一个高管身份验证文件。
- 这个文件上盖有公司章(根证书签名),所以所有员工都可以验证这个文件的真实性。
-
员工信任公司的信任凭证(客户端信任根证书):
- 公司在入职培训时告诉所有员工,任何带有公司章的文件都是可信的。
- 因此,员工会把公司章(根证书)存储在他们的记忆中,并用它来验证任何带有公司章的文件。
更新服务端证书
现在,高管的身份验证文件(服务端证书)即将过期,需要更新:
-
高管申请新文件:
- 高管向公司申请一个新的身份验证文件(新的服务端证书)。
- 公司用自己的公司章(根证书)再次签署并发布新的身份验证文件。
-
员工验证新的高管文件:
- 新的身份验证文件依然带有公司章(根证书签名)。
- 员工使用存储在他们记忆中的公司章(客户端信任的根证书)来验证新的文件。
关键点
- 根证书(公司章)始终是相同的:根证书是公司自己签发并受信任的,所以它在信任链的最顶端。
- 签名链的完整性:无论高管的身份验证文件(服务端证书)更新多少次,只要它是由根证书(公司章)签署的,员工(客户端)就能验证其真实性。
- 客户端只需要信任根证书:客户端(员工)只需要一次性信任根证书(公司章)。之后,任何由这个根证书签署的证书(身份验证文件)都能被验证成功。
总结
由根证书签发的服务端证书,即使更新了,客户端依然能验证成功的原因在于:
- 客户端只需要信任一次根证书。
- 任何由根证书签署的证书,都能被客户端验证。
- 更新后的服务端证书依然由同一个根证书签署,确保了信任链的完整性。
通过这个类比,您可以更直观地理解根证书和服务端证书之间的信任关系,以及为什么客户端在根证书不变的情况下可以持续信任更新后的服务端证书。
相关文章:
SSL 自定义证书创建过程
1、生成自签名根证书和私钥 1.1 生成根证书 1.1.1生成根证书私钥 首先,生成一个自签名的根证书和私钥。这个根证书将作为信任锚(Trust Anchor),客户端会信任由这个根证书签署的所有证书。 openssl genrsa -out rootCA.key 204…...

javaSwing飞机订票系统
摘要 Java swing实现的飞机票预定系统,系统数据库原本采用的是Oracle,我又改了一个mysql版本的,所以这套系统有两个版本,一个是mysql数据库版的,一个是Oracle数据库版 一. 已经完成的功能 : …...
赶紧收藏!2024 年最常见 20道 Redis面试题(四)
上一篇地址:赶紧收藏!2024 年最常见 20道 Redis面试题(三)-CSDN博客 七、Pipeline有什么好处,为什么要用pipeline? Redis Pipeline 是一种批量执行命令的技术,它允许客户端一次性发送多个命令…...

虚拟列表 vue-virtual-scroller 的使用
npm 详情:vue-virtual-scroller - npm (npmjs.com) 这里我使用的是RecycleScroller。 App.vue <template><RecycleScrollerclass"scroller":items"items":item-size"54"v-slot"{ item }"><list-item :it…...
前端基础入门三大核心之HTML篇:深入理解重绘与重排 —— 概念、区别与实战演练
前端基础入门三大核心之HTML篇:深入理解重绘与重排 —— 概念、区别与实战演练 HTML渲染基础回顾重绘与重排的概念重绘(Repaint)重排(Reflow) 区别与影响实战示例:优化策略与代码演示示例1:避免…...

【C/C++笔试练习】TCP、IP广播、ARP协议、IP路由器、MAC协议、三次握手、TCP/IP、子网划分年、会抽奖、抄送列表
文章目录 C/C笔试练习选择部分(1)TCP(2)IP广播(3)ARP协议(4)IP路由器(5)MAC协议(6)三次握手(7)TCP/IP…...

线程的概念和控制
文章目录 线程概念线程的优点线程的缺点线程异常线程用途理解虚拟地址 线程控制线程的创建线程终止线程等待线程分离封装线程库 线程概念 什么是线程? 在一个程序里的一个执行路线就叫做线程(thread)。更准确的定义是:线程是“一…...

PHS树脂(聚对羟基苯乙烯)为KrF光刻胶专用树脂 本土企业具备百公斤级别量产能力
PHS树脂(聚对羟基苯乙烯)为KrF光刻胶专用树脂 本土企业具备百公斤级别量产能力 PHS树脂又称聚对羟基苯乙烯树脂、聚羟基苯乙烯树脂,指以对羟基苯乙烯作为基材制成的光刻胶树脂。与其他光刻胶树脂相比,PHS树脂具有极佳热稳定性、化…...

Python 机器学习 基础 之 数据表示与特征工程 【单变量非线性变换 / 自动化特征选择/利用专家知识】的简单说明
Python 机器学习 基础 之 数据表示与特征工程 【单变量非线性变换 / 自动化特征选择/利用专家知识】的简单说明 目录 Python 机器学习 基础 之 数据表示与特征工程 【单变量非线性变换 / 自动化特征选择/利用专家知识】的简单说明 一、简单介绍 二、单变量非线性变换 三、自…...

uniapp-自定义navigationBar
封装导航栏自定义组件 创建 nav-bar.vue <script setup>import {onReady} from dcloudio/uni-appimport {ref} from vue;const propsdefineProps([navBackgroundColor])const statusBarHeight ref()const navHeight ref()onReady(() > {uni.getSystemInfo({success…...

多式联运奇迹:探索 GPT-4o 的尖端功能
取得的显着进展的DigiOps与人工智能已经标志着重要的里程碑,随着时间的推移塑造了人工智能系统的能力。从早期基于规则系统的出现机器学习和深入学习,人工智能已经发展得更加先进和通用。 生成式预训练 Transformer (GPT) by OpenAI 已特别值得注意。每…...

前端 CSS 经典:好看的标题动画
前言:好看的标题动画实现。 效果: <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><…...

Vue项目打包优化(element+echarts+vue使用cdn)
如何打包查看所有资源大小? 使用插件:webpack-bundle-analyzer 效果图: 安装webpack-bundle-analyzer 第一步,终端执行 npm instatll webpack-bundle-analyzer --save-dev第二步,vue.config.js配置 module.export…...
【ARM 嵌入式 C 入门及渐进 6.1 -- ARMv8 C 内嵌汇编写系统寄存器的函数实现】
请阅读【嵌入式开发学习必备专栏】 文章目录 ARMv8 C 内嵌汇编写系统寄存器 ARMv8 C 内嵌汇编写系统寄存器 在ARMv8架构下,使用C语言结合内嵌汇编实现将一个值写入特定系统寄存器的函数可以按照下面的方法进行。 下面这个示例展示了如何将一个uint64_t类型的值写入…...

ESP32基础应用之使用手机浏览器作为客户端与ESP32作为服务器进行通信
文章目录 1 准备2 移植2.1 softAP工程移植到simple工程中2.2 移植注意事项 3 验证 1 准备 参考工程 Espressif\frameworks\esp-idf-v5.2.1\examples\wifi\getting_started\softAP softAP工程演示将ESP32作为AP,即热点,使手机等终端可以连接参考工程 Esp…...

【课后练习分享】Java用户注册界面设计和求三角形面积的图形界面程序
目录 java编程题(每日一练): 问题一的答案代码如下: 问题一的运行截图如下: 问题二的答案代码如下: 问题二的运行截图如下: java编程题(每日一练): 1.…...

三维空间坐标系变换(旋转平移)
在探究三维空间下的变换前,首先研究二位空间,因为比较直观,再推广到三维空间。 首先应该清楚的一点是:旋转、平移对于坐标系下的点以及坐标系本身而言都是相对的(运动的相对性)。 例如: X O Y …...

OC笔记之foundation框架
OC学习笔记(三) 文章目录 OC学习笔记(三)常用Foundation框架结构体NSRangeNSRange结构体的定义定义 NSRange 的方法打印Range的相关信息NSRange的实际运用查找子字符串返回NSRange结构体 NSPointNSRect NSStringNSString的创建NSS…...

Docker部署springboot包并联通MySQL
Docker部署jar 实现功能 部署springboot下发布的jar包不同docker容器之间通信(如MySQL访问、Redis访问)多个jar包部署 参考文献 Just a moment… Just a moment… https://www.jb51.net/article/279449.htm springboot配置 这里使用多yaml配置文件&…...
多帧激光点云基于标定参数进行融合拼接
1、前言 在三维视觉技术蓬勃发展的今天,点云作为捕获和表示三维环境的基础数据形式,扮演着至关重要的角色。点云融合拼接技术,作为连接孤立点云片段、构建连续、全面三维场景的核心过程,对于自动驾驶、机器人导航、三维建模以及地…...
DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径
目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端
🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...
系统设计 --- MongoDB亿级数据查询优化策略
系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log,共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题,不能使用ELK只能使用…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用
1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...
【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统
目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...

python执行测试用例,allure报乱码且未成功生成报告
allure执行测试用例时显示乱码:‘allure’ �����ڲ����ⲿ���Ҳ���ǿ�&am…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...

OPENCV形态学基础之二腐蚀
一.腐蚀的原理 (图1) 数学表达式:dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一,腐蚀跟膨胀属于反向操作,膨胀是把图像图像变大,而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...
docker 部署发现spring.profiles.active 问题
报错: org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...
Pinocchio 库详解及其在足式机器人上的应用
Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库,专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性,并提供了一个通用的框架&…...