密码技术 (6) - 证书
一. 前言
前面介绍的公钥密码和数字签名,都无法解决一个问题,那就是判断自己获取的公钥是否期望的,不能确定公钥是否被中间攻击人掉包。所以,证书的作用是用来证明公钥是否合法的。本文介绍的证书就是解决证书的可靠性的技术。
二. 证书的概念和应用场景
1. 概念
证书的全称是公钥证书(Public-Key Certificate,PKC),里面同时还有姓名,组织,邮箱地址等个人信息,并且还有属于此人的公钥,并由认证机构(Certification Authority、Certifying Authority,CA)施加数字签名。只要看到公钥证书,我们就可以知道认证机构认定该公钥属于此人。就如同我们看到某人的驾照,我们就知道该人通过了驾驶考试,因为上面盖有公安局的公章。
2. 证书的应用场景
下面先以一张图介绍证书是怎么应用的,如下:
详细步骤如下:
(1) Bob生成密钥对
要使用公钥密码进行通信,首先需要生成密钥对,Bob生成一对公钥和私钥,并将私钥自己保管,注意:密钥对可以Bob自己生成,也可以由认证机构代为生成。
(2) Bob在认证机构注册自己的公钥
这里,Bob不是直接将公钥发送给Alice,而是发送给认证机构,认证机构在收到Bob的公钥后,需要确认收到的公钥是否为Bob本人所有。
(3) 认证机构用自己的私钥对Bob的公钥施加数字签名并生成证书
认证机构对Bob的公钥加上数字签名,生成数字签名,需要用到认证机构自身的私钥,因此,认证机构也要事先生成密钥对。
(4) Alice得到认证机构的数字签名和Bob的公钥(也就是证书)
Alice需要向Bob发送密文,她会从认证机构获取证书,证书中包含Bob的公钥和机构的数字签名。
(5) Alice使用认证机构的公钥解密数字签名,对比Bob公钥,确认Bob公钥的合法性
Alice使用认证机构的公钥对数字签名进行解密,然后和其中的公钥对比,如果验证一致,则可以认为此公钥确实来自Bob。
(6) Alice用Bob的公钥加密消息并发送给Bob
Alice用Bob的公钥的加密要发送的消息,并将消息发送给Bob。
(7) Bob用自己的私钥解密密文得到Alice的消息
Bob收到Alice的密文,用自己的私钥解密,得到Alice发给自己的消息。
经过上面的步骤,发送者和接收者就实现安全的通信了。
三. 证书的标准规范
证书是由认证机构颁发的,使用者需要对证书进行验证,如果证书的格式不一致就不方便。于是,ITU(International Telecommunication Union,国际电信联盟)和ISO(International Organization for Standardization,国际标准化组织)指定了X.509规范。
X.509证书大致包含:证书序列号、证书颁发者、公钥所有者、SHA-1指纹、MD5指纹、证书ID、有效期(起始时间)、有效期(结束时间)、散列算法、秘钥类型、秘钥ID和秘钥用途。以下是一个完整的自签名证书:
Certificate:
Data:
Version: 1 (0x0)
Serial Number:
31:bf:6e:78:d2:51:97:8d:2c:44:e8:41:9c:3e:ed:75:c5:fc:2f:78
Signature Algorithm: sha256WithRSAEncryption
Issuer: C = CN, ST = GuangDong, L = GuangZhou, O = Example Company, OU = IT Department, CN = to_be_better_wen, emailAddress = admin@example.com
Validity
Not Before: Oct 3 03:31:46 2023 GMT
Not After : Oct 2 03:31:46 2024 GMT
Subject: C = CN, ST = GuangDong, L = GuangZhou, O = Example Company, OU = IT Department, CN = to_be_better_wen, emailAddress = admin@example.com
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
RSA Public-Key: (2048 bit)
Modulus:
00:b3:f9:61:05:a4:f3:3c:d2:2f:2c:a2:9d:36:3b:
7f:69:9b:1d:4b:f0:53:7a:5d:66:ef:66:36:f8:3e:
c0:c6:90:c8:1c:13:d7:60:f3:ec:e4:10:a4:e0:3d:
82:6c:68:96:6e:d9:47:61:03:b0:7c:f6:0f:64:bf:
04:07:d8:8d:c1:50:0a:98:85:0b:f1:13:c7:7c:df:
a4:2d:fc:63:1b:f9:71:78:04:50:9e:2d:06:15:53:
01:9b:f3:04:5a:18:9e:65:55:21:82:07:f3:32:2d:
bb:c6:be:b1:af:bf:6a:fe:76:37:1f:64:2f:9c:2e:
35:bf:0c:50:e5:a6:f7:db:59:7e:60:7d:c0:fb:53:
09:f4:4d:f8:8d:87:9a:d3:e9:39:f3:42:67:53:c1:
78:5e:64:cb:12:a4:08:64:97:3f:53:d5:35:d3:84:
f3:b4:ff:ed:a6:b2:9d:24:94:69:ac:ab:f2:b5:cb:
d8:f8:2f:70:3e:eb:df:28:c8:f4:f0:ed:23:92:92:
2c:35:83:42:ac:11:0c:c0:65:b2:c8:51:c2:51:9f:
c8:ab:a6:85:fd:d3:d1:af:90:13:6c:63:fa:8c:40:
73:aa:c5:33:39:c5:32:ea:b0:a3:99:70:25:8e:60:
57:f3:55:70:8a:38:91:3c:9c:07:32:1d:78:88:94:
09:81
Exponent: 65537 (0x10001)
Signature Algorithm: sha256WithRSAEncryption
61:b1:30:02:6d:a5:0a:3a:33:9a:75:c2:9e:66:5f:3a:86:5f:
71:d8:96:e9:8d:71:93:a7:e5:ef:c2:cd:8a:de:3e:ec:b8:5a:
ff:c1:00:10:a0:3e:fe:0a:1a:81:d3:15:1b:ba:63:80:47:30:
53:e7:f5:4b:0a:8e:f3:a1:97:9f:8a:15:ab:02:71:ea:1b:72:
4c:08:98:01:50:f2:e2:aa:51:8e:31:f3:7a:08:b2:fd:f8:f2:
78:f6:04:16:5b:5f:91:90:3c:08:ed:cc:72:6a:bf:67:c5:67:
00:29:9a:36:52:5d:1b:73:0c:cf:9e:c3:56:f1:19:8c:1f:09:
56:ad:69:f9:eb:3a:5c:8c:8e:da:67:b6:0b:2d:a2:c2:d9:fa:
51:b9:d2:d8:94:96:e1:15:18:a6:de:3a:12:01:16:74:87:62:
a7:7a:c3:d1:02:7f:82:f9:43:5b:28:e5:3a:2e:1a:89:f5:b9:
84:13:e9:90:c8:b0:fc:60:21:54:0c:78:9a:76:42:2e:e2:36:
a4:00:26:f9:0e:e2:cb:7e:8a:15:1a:65:b5:ba:f5:fa:41:c1:
55:05:23:1a:67:de:9d:e5:09:5d:20:66:10:3b:c8:15:7a:33:
4e:fb:fb:17:6e:c4:e1:01:ab:62:18:c8:da:09:bb:35:33:ac:
43:85:91:ff
四. openssl实践
这里将介绍使用openssl生成自签名证书的过程,自签名证书表示只是用于自己使用,使用自己的私钥生成即可,而不需要去找认证机构生成的证书。下面是详细步骤:
1. 生成私钥
openssl genrsa -out private.key 2048
这里直接生成了2048比特的私钥。没有对私钥进行加密,如果需要对私钥加密,则要加对称密码算法选项,例如:-aes128,输入命令回车后,会提示输入密码。
2. 创建证书签名申请文件
证书签名申请(Certificate signing request,CSR),该申请包含申请者的公钥和申请者的某些信息,这个文件在正常的情况下,是由申请者自己生成,然后提交给认证机构的,认证机构用这个文件来生成证书。命令如下:
[root@ ca]#openssl req -new -key private.key -out fd.csr
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:CN
State or Province Name (full name) [Some-State]:GuangDong
Locality Name (eg, city) []:GuangZhou
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Example Company
Organizational Unit Name (eg, section) []:IT Department
Common Name (e.g. server FQDN or YOUR name) []:to_be_better_wen
Email Address []:admin@example.comPlease enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
输完命令回车后,会提示输入一些信息,包括国家,省,市,公司,部门,姓名和邮箱。challenge password和optional company name可以留空。
CSR文件内容如下:
[root@ ca]#cat fd.csr
-----BEGIN CERTIFICATE REQUEST-----
MIIC6jCCAdICAQAwgaQxCzAJBgNVBAYTAkNOMRIwEAYDVQQIDAlHdWFuZ0Rvbmcx
......
/xitQdLpj0yvWbFcPwAB8R6lqtR+2e/c1nZaMvHk
-----END CERTIFICATE REQUEST-----
可以看到,CSR文件是以BEGIN CERTIFICATE REQUEST开头,以END CERTIFICATE REQUEST结尾的。
可以使用如下命令查看CSR文件的内容:
[root@ ca]#openssl req -text -in fd.csr -noout
Certificate Request:
Data:
Version: 1 (0x0)
Subject: C = CN, ST = GuangDong, L = GuangZhou, O = Example Company, OU = IT Department, CN = to_be_better_wen, emailAddress = admin@example.com
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
RSA Public-Key: (2048 bit)
Modulus:
00:b3:f9:61:05:a4:f3:3c:d2:2f:2c:a2:9d:36:3b:
......
09:81
Exponent: 65537 (0x10001)
Attributes:
a0:00
Signature Algorithm: sha256WithRSAEncryption
10:69:27:36:0a:14:1f:1b:31:bd:51:de:22:c7:95:c3:30:0f:
......
5a:32:f1:e4
3. 生成自签名证书
使用之前生成的私钥和CSR文件就可以生成自签名证书了,命令如下:
openssl x509 -req -days 365 -in fd.scr -signkey private.key -out fd.crt
x509表示生成x.509格式的证书,-days 365表示证书的有效期为1年,fd.crt则是最终的证书了。
证书的内容如下:
[root@ ca]#cat fd.crt
-----BEGIN CERTIFICATE-----
MIID0TCCArkCFDG/bnjSUZeNLEToQZw+7XXF/C94MA0GCSqGSIb3DQEBCwUAMIGk
......
+/sXbsThAatiGMjaCbs1M6xDhZH/
-----END CERTIFICATE-----
4. 检查证书
由上可知,证书的内容是不可读的,无法直接检查,需要使用命令转化可读,命令如下:
[root@ ca]#openssl x509 -text -in fd.crt -noout
Certificate:
Data:
Version: 1 (0x0)
Serial Number:
31:bf:6e:78:d2:51:97:8d:2c:44:e8:41:9c:3e:ed:75:c5:fc:2f:78
Signature Algorithm: sha256WithRSAEncryption
Issuer: C = CN, ST = GuangDong, L = GuangZhou, O = Example Company, OU = IT Department, CN = to_be_better_wen, emailAddress = admin@example.com
Validity
Not Before: Oct 3 03:31:46 2023 GMT
Not After : Oct 2 03:31:46 2024 GMT
Subject: C = CN, ST = GuangDong, L = GuangZhou, O = Example Company, OU = IT Department, CN = to_be_better_wen, emailAddress = admin@example.com
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
RSA Public-Key: (2048 bit)
Modulus:
00:b3:f9:61:05:a4:f3:3c:d2:2f:2c:a2:9d:36:3b:
......
09:81
Exponent: 65537 (0x10001)
Signature Algorithm: sha256WithRSAEncryption
61:b1:30:02:6d:a5:0a:3a:33:9a:75:c2:9e:66:5f:3a:86:5f:
......
43:85:91:ff
至此,公钥证书就生成完毕了。
5. 从证书中提取公钥
消息的发送者获取到了证书,这时需要从证书中提取公钥,用于加密消息。可以使用如下命令提取公钥:
openssl x509 -in fd.crt -pubkey -noout > public.key
五. 总结
本文介绍了证书的作用:用于证明公钥的合法性。以及介绍了当消息发送者和消息接收者通信前,消息接收者怎么向认证机构(CA)申请证书的大致步骤,最后介绍了使用openssl怎么生成一个自签名证书。
相关文章:

密码技术 (6) - 证书
一. 前言 前面介绍的公钥密码和数字签名,都无法解决一个问题,那就是判断自己获取的公钥是否期望的,不能确定公钥是否被中间攻击人掉包。所以,证书的作用是用来证明公钥是否合法的。本文介绍的证书就是解决证书的可靠性的技术。 二…...

【算法学习】-【双指针】-【盛水最多的容器】
LeetCode原题链接:盛水最多的容器 下面是题目描述: 给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。…...

JAVA面经整理(8)
一)为什么要有区,段,页? 1)页是内存和磁盘之间交互的基本单位内存中的值修改之后刷到磁盘的时候还是以页为单位的索引结构给程序员提供了高效的索引实现方式,不过索引信息以及数据记录都是记录在文件上面的,确切来说是…...

【Java 进阶篇】JDBC数据库连接池Druid详解
在Java应用程序中,与数据库进行交互是一个常见的任务。为了更有效地管理数据库连接并提高性能,数据库连接池是一种常见的解决方案。Druid是一个流行的JDBC数据库连接池,它具有丰富的功能和高性能。本博客将详细介绍Druid连接池,包…...

Linux——指令初识
Linux下基本指令 前言一、 ls 指令二、 pwd命令三、cd 指令四、 touch指令五、mkdir指令六、rmdir指令 && rm 指令七、man指令八、cp指令九、mv指令十、cat指令十一、.more指令十二、less指令十三、head指令十四、tail指令总结 前言 linux的学习开始啦! 今…...

专题一:双指针【优选算法】
双指针应用场景: 数组划分、数组分块 目录 一、移动0 二、复写0 从后向前 三、快乐数 链表带环 四、盛水最多的容器 单调性双指针 五、有效三角形个数 单调性双指针 六、和为s的两个数字 七、三数之和 细节多 需再练 一、移动0 class Solution { public:void move…...
蓝桥等考Python组别十二级007
第一部分:选择题 1、Python L12 (15分) 运行下面程序,输出的结果是( )。 lis = [A, B, C, D, E, F] print(lis[0 : 3]) [A, B, C][A, B][A, B, C, D][B, C, D]正确答案:A 2...

全方位介绍工厂的MES质量检验管理系统
一、MES质量检验管理系统的定义: MES质量检验管理系统是基于制造执行系统的框架和功能,专注于产品质量的控制和管理。它通过整合和优化质量检验流程,提供实时的数据采集、分析和反馈,帮助工厂实现高效的质量管理。该系统涵盖了从…...
避免风险,亚马逊、沃尔玛、阿里国际站选择什么样的测评方式最安全?
亚马逊、沃尔玛、速卖通、阿里国际站上做测评是最有效的推广手段之一,而测评又存在很大的风险。但是测评的风险来自哪里?什么样的测评方式才安全呢? 因为平台大数据风控点很多,根据洪哥六七年的测评经验,风控包括以下…...
【C语言】语法--联合体union详解
本文参考博客: https://blog.csdn.net/m0_57180439/article/details/120417270 定义及示例: 联合是一种特殊的自定义类型,该种类型定义的变量也包含一系列的成员,特征是这些成员共用同一块空间,所以联合体也被称为共用体。 #include<stdio.h> union Un//联合类型…...

接口测试复习
一。基本概念 接口概念:系统与系统之间 数据交互的通道。 接⼝测试概念:校验 预期结果 与 实际结果 是否⼀致。 特征: 测试⻚⾯测试发现不了的问题。(因为:接⼝测试 绕过前端界⾯。 ) 符合质量控制前移理…...

获取医疗器械板块的个股列表
获取医疗器械板块的个股列表,用python爬虫做到(数据网址:板块 - 医疗器械概念 - 股票行情中心 - 搜狐证券) import requests from bs4 import BeautifulSoup # 获取医疗器械概念个股列表url "https://q.stock.sohu.com/cn/…...
1026 程序运行时间
要获得一个 C 语言程序的运行时间,常用的方法是调用头文件 time.h,其中提供了 clock() 函数,可以捕捉从程序开始运行到 clock() 被调用时所耗费的时间。这个时间单位是 clock tick,即“时钟打点”。同时还有一个常数 CLK_TCK&…...

博途1200/1500 ALT指令
SMART PLC的ALT指令实现代码,请查看下面文章博客 SMART PLC如何构造ALT指令_smart200类似alt指令-CSDN博客单按钮启停这些老生常谈的问题,很多人感兴趣。这篇博文讨论下不同的实现方法,希望对大家有所帮助。指令虽然简单,但是在编程的时候合理使用对我们高效率编程帮助还是…...
11、视频分类建议
8、绩效看板与日清计划 9、大小屏分离与精细化审核 10、质量审核的设立与合并 视频分类印象深刻,因为这是我亲手做的第一个增效工具。 审核的其中一个任务是保证视频分类信息的准确性,账号本身是有一个缺省分类的,内容上传之后默认使用账号…...

【计算机组成原理】考研真题攻克与重点知识点剖析 - 第 2 篇:数据的表示和运算
前言 本文基础知识部分来自于b站:分享笔记的好人儿的思维导图与王道考研课程,感谢大佬的开源精神,习题来自老师划的重点以及考研真题。此前我尝试了完全使用Python或是结合大语言模型对考研真题进行数据清洗与可视化分析,本人技术…...
使用maven框架搭建一个IDEA插件项目
以下是使用 Maven 框架搭建 IDEA 插件项目的步骤: 打开 IDEA,点击 File -> New -> Project,选择 Maven。 在弹出的 New Project 窗口中,选择 Maven,然后选择 Create from archetype,找到 Maven 插件…...
第二届全国高校计算机技能竞赛——C++赛道 题解
Powered by:NEFU AB-IN Link 文章目录 第二届全国高校计算机技能竞赛——C赛道A 互不侵犯题意思路代码 B 奖学金题意思路代码 C 领导者题意思路代码 D 空调题意思路代码 E 字符操作变换题意思路代码 第二届全国高校计算机技能竞赛——C赛道 A 互不侵犯 题意 在象棋中ÿ…...

八大排序源码(含优化)
文章目录 1、直接插入排序2、希尔排序3、选择排序4、冒泡排序5、堆排序6、快速排序快速排序递归实现霍尔法挖坑法前后指针法快速排序小区间优化 快速排序非递归实现 7、归并排序归并排序递归实现归并排序非递归 8、计数排序 大家好,我是纪宁,这篇文章是关…...

单调队列---数据结构与算法
简介 队列也是一种受限制的线性表和栈相类似,栈是先进后出,而队列是先进先出,就好像一没有底的桶,往里面放东西,如图 在这里也是用数组来实现队列,用数组实现的叫做顺序队列 队列的数组模拟 const int N…...

网络六边形受到攻击
大家读完觉得有帮助记得关注和点赞!!! 抽象 现代智能交通系统 (ITS) 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 (…...
【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15
缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下: struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...

【Oracle APEX开发小技巧12】
有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...

汽车生产虚拟实训中的技能提升与生产优化
在制造业蓬勃发展的大背景下,虚拟教学实训宛如一颗璀璨的新星,正发挥着不可或缺且日益凸显的关键作用,源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例,汽车生产线上各类…...

如何理解 IP 数据报中的 TTL?
目录 前言理解 前言 面试灵魂一问:说说对 IP 数据报中 TTL 的理解?我们都知道,IP 数据报由首部和数据两部分组成,首部又分为两部分:固定部分和可变部分,共占 20 字节,而即将讨论的 TTL 就位于首…...

Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

Docker 本地安装 mysql 数据库
Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker ;并安装。 基础操作不再赘述。 打开 macOS 终端,开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...
PAN/FPN
import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...

Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)
引言 在人工智能飞速发展的今天,大语言模型(Large Language Models, LLMs)已成为技术领域的焦点。从智能写作到代码生成,LLM 的应用场景不断扩展,深刻改变了我们的工作和生活方式。然而,理解这些模型的内部…...

如何应对敏捷转型中的团队阻力
应对敏捷转型中的团队阻力需要明确沟通敏捷转型目的、提升团队参与感、提供充分的培训与支持、逐步推进敏捷实践、建立清晰的奖励和反馈机制。其中,明确沟通敏捷转型目的尤为关键,团队成员只有清晰理解转型背后的原因和利益,才能降低对变化的…...