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、前言 在三维视觉技术蓬勃发展的今天,点云作为捕获和表示三维环境的基础数据形式,扮演着至关重要的角色。点云融合拼接技术,作为连接孤立点云片段、构建连续、全面三维场景的核心过程,对于自动驾驶、机器人导航、三维建模以及地…...
多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...
从WWDC看苹果产品发展的规律
WWDC 是苹果公司一年一度面向全球开发者的盛会,其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具,对过去十年 WWDC 主题演讲内容进行了系统化分析,形成了这份…...
MFC内存泄露
1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...
pam_env.so模块配置解析
在PAM(Pluggable Authentication Modules)配置中, /etc/pam.d/su 文件相关配置含义如下: 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块,负责验证用户身份&am…...
屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!
5月28日,中天合创屋面分布式光伏发电项目顺利并网发电,该项目位于内蒙古自治区鄂尔多斯市乌审旗,项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站,总装机容量为9.96MWp。 项目投运后,每年可节约标煤3670…...
NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合
在汽车智能化的汹涌浪潮中,车辆不再仅仅是传统的交通工具,而是逐步演变为高度智能的移动终端。这一转变的核心支撑,来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒(T-Box)方案:NXP S32K146 与…...
android13 app的触摸问题定位分析流程
一、知识点 一般来说,触摸问题都是app层面出问题,我们可以在ViewRootImpl.java添加log的方式定位;如果是touchableRegion的计算问题,就会相对比较麻烦了,需要通过adb shell dumpsys input > input.log指令,且通过打印堆栈的方式,逐步定位问题,并找到修改方案。 问题…...
AD学习(3)
1 PCB封装元素组成及简单的PCB封装创建 封装的组成部分: (1)PCB焊盘:表层的铜 ,top层的铜 (2)管脚序号:用来关联原理图中的管脚的序号,原理图的序号需要和PCB封装一一…...
Java设计模式:责任链模式
一、什么是责任链模式? 责任链模式(Chain of Responsibility Pattern) 是一种 行为型设计模式,它通过将请求沿着一条处理链传递,直到某个对象处理它为止。这种模式的核心思想是 解耦请求的发送者和接收者,…...
Python 解释器安装全攻略(适用于 Linux / Windows / macOS)
目录 一、Windows安装Python解释器1.1 下载并安装Python解释1.2 测试安装是否成功1.3 设置pip的国内镜像------永久配置 二、macOS安装Python解释器三、Linux下安装Python解释器3.1 Rocky8.10/Rocky9.5安装Python解释器3.2 Ubuntu2204/Ubuntu2404安装Python解释器3.3 设置pip的…...
