当前位置: 首页 > news >正文

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 文件的原因。

生成自签名根证书的过程如下:

  1. 生成一对密钥(公钥和私钥)。
  2. 使用私钥签署生成的证书。

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哈希算法。

类比解释:信任关系

假设有一个大公司(根证书),公司里有一个高管(服务端证书),还有许多员工(客户端)。公司决定了一套信任规则来管理所有员工的工作和身份验证。

  1. 大公司发布了自己的信任凭证(根证书):

    • 大公司自己发布了一个“公司章”(自签名证书),所有员工都认可这个公司章。
    • 这个公司章表示大公司本身是可信的,不需要别人来验证它,因为所有人都知道它并信任它。
  2. 高管获得了公司的信任凭证(服务端证书):

    • 高管需要一个身份验证(服务端证书),于是公司用自己的公司章给高管发布了一个高管身份验证文件。
    • 这个文件上盖有公司章(根证书签名),所以所有员工都可以验证这个文件的真实性。
  3. 员工信任公司的信任凭证(客户端信任根证书):

    • 公司在入职培训时告诉所有员工,任何带有公司章的文件都是可信的。
    • 因此,员工会把公司章(根证书)存储在他们的记忆中,并用它来验证任何带有公司章的文件。

更新服务端证书

现在,高管的身份验证文件(服务端证书)即将过期,需要更新:

  1. 高管申请新文件

    • 高管向公司申请一个新的身份验证文件(新的服务端证书)。
    • 公司用自己的公司章(根证书)再次签署并发布新的身份验证文件。
  2. 员工验证新的高管文件

    • 新的身份验证文件依然带有公司章(根证书签名)。
    • 员工使用存储在他们记忆中的公司章(客户端信任的根证书)来验证新的文件。

关键点

  • 根证书(公司章)始终是相同的:根证书是公司自己签发并受信任的,所以它在信任链的最顶端。
  • 签名链的完整性:无论高管的身份验证文件(服务端证书)更新多少次,只要它是由根证书(公司章)签署的,员工(客户端)就能验证其真实性。
  • 客户端只需要信任根证书:客户端(员工)只需要一次性信任根证书(公司章)。之后,任何由这个根证书签署的证书(身份验证文件)都能被验证成功。

总结

由根证书签发的服务端证书,即使更新了,客户端依然能验证成功的原因在于:

  • 客户端只需要信任一次根证书。
  • 任何由根证书签署的证书,都能被客户端验证。
  • 更新后的服务端证书依然由同一个根证书签署,确保了信任链的完整性。

通过这个类比,您可以更直观地理解根证书和服务端证书之间的信任关系,以及为什么客户端在根证书不变的情况下可以持续信任更新后的服务端证书。

 

 

http://www.lryc.cn/news/351050.html

相关文章:

  • javaSwing飞机订票系统
  • 赶紧收藏!2024 年最常见 20道 Redis面试题(四)
  • 虚拟列表 vue-virtual-scroller 的使用
  • 前端基础入门三大核心之HTML篇:深入理解重绘与重排 —— 概念、区别与实战演练
  • 【C/C++笔试练习】TCP、IP广播、ARP协议、IP路由器、MAC协议、三次握手、TCP/IP、子网划分年、会抽奖、抄送列表
  • 线程的概念和控制
  • PHS树脂(聚对羟基苯乙烯)为KrF光刻胶专用树脂 本土企业具备百公斤级别量产能力
  • Python 机器学习 基础 之 数据表示与特征工程 【单变量非线性变换 / 自动化特征选择/利用专家知识】的简单说明
  • uniapp-自定义navigationBar
  • 多式联运奇迹:探索 GPT-4o 的尖端功能
  • 前端 CSS 经典:好看的标题动画
  • Vue项目打包优化(element+echarts+vue使用cdn)
  • 【ARM 嵌入式 C 入门及渐进 6.1 -- ARMv8 C 内嵌汇编写系统寄存器的函数实现】
  • ESP32基础应用之使用手机浏览器作为客户端与ESP32作为服务器进行通信
  • 【课后练习分享】Java用户注册界面设计和求三角形面积的图形界面程序
  • 三维空间坐标系变换(旋转平移)
  • OC笔记之foundation框架
  • Docker部署springboot包并联通MySQL
  • 多帧激光点云基于标定参数进行融合拼接
  • python数据类型之字符串
  • Vue3实战笔记(38)—粒子特效终章
  • 晶体振荡器
  • 单词可交互的弧形文本
  • Linux——进程信号(一)
  • centos9 stream在线安装NVIDIA驱动(rockylinux9.4也成功安装nvidia驱动)
  • springmvc不同格式的参数解析
  • Unity3D让BoxCollider根据子物体生成自适应大小
  • WSL 2 installation is incomplete.
  • Servlet的request对象
  • 蓝桥杯-合并数列