PKI体系与PKCS#7(Signed-data)结构
起源
PKI出现之前的加密通信系统都存在一些问题。
明文传输:A和B之间的信息易被C窃取和篡改。
加密传输(对称密钥):需要在通信前将密钥安全分发到对方。
加密传输(公钥密钥):加密速度慢。
数字信封:
A要给B发消息,A有一个对称密钥,B有一个非对称密钥(包括公钥和私钥)。
A先将明文用对称密钥加密,然后用B的公钥对该对称密钥进行加密,将明文加密结果和对称密钥加密结果一起发给B。
B收到后使用自己的私钥对该对称密钥加密结果进行解密,得到对称密钥,再使用对称密钥对明文加密结果进行解密,得到明文。
在上述过程中如果A所使用的B的公钥是假的,其实是攻击者C的公钥,A使用该公钥加密后,B是无法解密的,而C是可以解密的,C可以截取该消息,并用自己的私钥解密,最终得到明文信息。
因此需要一种方法确保一个特定的公钥属于一个特定的拥有者。
数字签名:
A向B发送消息,使用自己的私钥进行签名,将签名结果和原文一起发送给B,B使用A的公钥和原文进行验签。
这个过程中,如果B所使用的公钥是假的,是攻击者C的公钥,则对A发送过来的消息是无法验签的。而C可以截取该消息,对原文篡改后用自己的私钥进行签名,再发送给B,这时B对这个伪造的消息是可以验签的。
因此需要一种方法确保一个特定的公钥属于一个特定的拥有者。
数字证书
数字证书简称证书,是一个经过证书授权机构(即PKI中的证书认证机构CA)数字签名的文件,包含拥有者的公钥和相关身份信息。
证书有四种类型:
自签名证书:自己给自己签名,当没有办法向CA申请证书,但又要用到非对称加密算法时使用。
CA证书:CA给自己颁发的证书,拥有者和颁发者都是CA。当通信实体向CA申请本地证书时,需要先安装CA证书,使用CA的公钥加密信息再发送,即数字信封。
本地证书:CA给一个通信机构颁发的证书。
设备本地证书:实际颁发者是自己,是根据CA的证书来给自己颁发证书。
证书结构

最简单的证书包含一个公钥、名称以及CA的数字签名。
签名时对证书上的所有其他信息先计算哈希值,然后对该哈希值使用CA的私钥进行签名,得到签名值再放在证书里面。
验签时使用CA的公钥解密签名值,得到其他部分的哈希值,再对证书上其他部分用同样的HASH算法进行计算,比对得到的哈希值和解密的哈希值,若相同则说明该证书内容没有被篡改,该公钥是合法的公钥。
证书格式
设备支持三种文件格式保存证书
格式 | 描述 |
---|---|
PKCS#12 | 以二进制格式保存证书,可以包含私钥,也可以不包含私钥。常用的后缀有:.P12和.PFX |
DER | 以二进制格式保存证书,不包含私钥。常用后缀有:.DER、.CER和.CRT |
PEM | 以ASCII码格式保存证书,可以包含私钥,也可以不包含私钥。常用的后缀有:.PEM、 .CER和.CRT |
这里如果包含私钥的话,证书是一个文件,私钥是另一个文件,证书中不会包含私钥。
PKI体系
公钥基础设施PKI(Public Key Infrastructure),是一种遵循既定标准的证书管理平台,它利用公钥技术能够为所有网络应用提供安全服务。
PKI体系架构

一个PKI体系由终端实体、证书认证机构CA、证书注册机构RA、证书/CRL(证书废止列表)存储库四部分组成。
终端实体:向RA或CA申请证书、更新证书。
证书认证机构CA:负责颁发证书以及废止证书,通过发布证书或CRL信息到存储库来进行发布或废止。
证书注册机构RA:负责颁发证书,可分担CA的压力。
证书/CRL存储库:对终端实体开放,终端实体可以在存储库中下载所要通信的目的端的公钥信息,即证书。此外终端实体还可以通过带外加载的方式进行加载。
PKI生命周期
PKI的核心技术围绕着本地证书的申请、颁发、存储、下载、安装、验证、更新和撤销的整个生命周期展开。
证书首先要向CA申请,然后CA机构核实身份,颁发证书,存储在存储库中。
用户从存储库中下载证书,进行安装,然后验证证书有效期是否过期。
定期做更新,密钥被窃取等情况也要做更新。
如果证书不需要用了,就向CA申请注销。
证书申请
PKI终端实体生成一对公私钥。
将公钥和自己的身份信息发送给CA,CA核实PKI实体的身份,然后颁发证书。
私钥PKI实体自己保存,用来数字签名和数字信封。
PKI工作过程
针对一个使用PKI的网络,配置PKI的目的就是为指定的PKI实体向CA申请一个本地证书,并由设备对证书的有效性进行验证。

A与B向CA申请证书后,安装本地证书,然后从存储库中获取对端本地证书,验证对端本地证书的有效性,再建立通信。
PKCS#7
PKCS指“公钥密码学标准”,是RSA Security LLC于1990年代初设计和发布的一组公钥加密标准。
PKCS#7是在公钥加密系统中交换消息的一种加密标准。
ASN.1(抽象语法标记1),是一种定义抽象数据类型形式的标准。
PKCS#7的ASN.1结构描述为:
ContentInfo ::= SEQUENCE {
contentType ContentType,
content [0] EXPLICIT ANY DEFINED BY contentType OPTIONAL
}
即PKCS#7由contentType和content两部分组成,contentType是标识content的类型。
PKCS#7的content有六种类型,分别为:
- Data ---> 明文信息
- Signed-data ---> 数字签名
- Enveloped-data ---> 数字信封
- Signed-and-enveloped-data ---> 带签名的数字信封
- Digested-data ---> 信息摘要
- Encrypted-data ---> 加密数据
Signed-data类型
signed-date类型可用于存储证书和证书废止列表(CRL)。并且包括任意类型的数据和0个或多个签名者对数据的签名值。
.p7b文件是退化的SignedData结构,没有包括签名的数据,仅有证书和CRL。
ASN.1将该结构描述为:
SignedData ::= SEQUENCE {
version Version,
digestAlgorithms DigestAlgorithmIdentifiers,
contentInfo ContentInfo,
certificates [0] IMPLICIT ExtendedCertificatesAndCertificates OPTIONAL,
crls [1] IMPLICIT CertificateRevocationLists OPTIONAL,
signerInfos SignerInfos
}
其中digestAlgorithms、certificates、crls、signerInfos都是集合类型。
各字段解释如下
version:语法版本
digestAlgorithms:摘要算法列表,如果有多个签名者则分别对应他们的摘要算法。
contentInfo:要签名的内容
certificates:签名者的证书列表,PKCS#6扩展的证书和X.509证书格式
crls:证书废止列表
signerInfos:签名者信息列表
signerInfos
signerInfos结构描述为:
SignerInfo ::= SEQUENCE {
version Version,
issuerAndSerialNumber IssuerAndSerialNumber,
digestAlgorithm DigestAlgorithmIdentifier,
authenticatedAttributes [0] IMPLICIT Attributes OPTIONAL,
digestEncryptionAlgorithm DigestEncryptionAlgorithmIdentifier,
encryptedDigest EncryptedDigest,
unauthenticatedAttributes [1] IMPLICIT Attributes OPTIONAL
}
其中authenticatedAttributes、unauthenticatedAttributes都是集合类型。
各字段解释如下
version:语法版本
issuerAndSerialNumber:通过颁发者的可区别名和证书序列号来指定签名者的证书
digestAlgorithm:对内容进行摘要的算法和相关的参数。
authenticatedAttributes:签名者签名属性的集合,这个字段是可选的。
digestEncryptionAlgorithm:对摘要进行签名的算法
encryptedDigest:对内容的摘要值进行签名的结果,即签名值
unauthenticatedAttributes:没有被签名或认证的属性集,这个字段是可选的。
certificates
x.509 V3证书结构用ASN.1描述为:
Certificate::=SEQUENCE{
tbsCertificate TBSCertificate,
signatureAlgorithm AlgorithmIdentifier,
signatureValue BIT STRING
}
各字段解释如下
tbsCertificate:证书主体
signatureAlgorithm:证书签名算法(摘要算法和签名算法)
signatureValue:证书签名值,使用签名算法(signatureAlgorithm)对证书主体部分(tbsCertificate)的摘要结果进行签名所得的值
其中tbsCertificate的结构描述为:
TBSCertificate::=SEQUENCE{
version [0] EXPLICIT Version DEFAULT v1,
serialNumber CertificateSerialNumber,
signature AlgorithmIdentifier,
issuer Name,
validity Validity,
subject Name,
subjectPublicKeyInfo SubjectPublicKeyInfo,
issuerUniqueID [1] IMPLICIT UniqueIdentifier OPTIONAL,
subjectUniqueID [2] IMPLICIT UniqueIdentifier OPTIONAL,
extensions [3] EXPLICIT Extensions OPTIONAL
}
各字段解释如下
version:证书版本号
serialNumber:证书序列号,对同一CA颁发的证书,序列号唯一标识证书
signature:证书签名算法(摘要算法和签名算法)
issuer:证书颁发者信息
validity:证书有效期,包括起始时间和终止时间
subject:证书持有者信息
subjectPublicKeyInfo:证书的公钥信息,包括公钥算法和公钥值
issuerUniqueID:证书颁发者的唯一ID(可选)
subjectUniqueID:证书持有者的唯一ID(可选)
extensions:证书拓展部分(可选)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律