PKI体系与PKCS#7(Signed-data)结构

起源

flowchart TB 明文传输 --> 1["加密传输(对称密钥)"] --> 2["加密传输(公钥密钥)"] --> 3["数字信封(对称和公钥密钥结合)"] --> 4["数字签名"] --> 5["PKI(数字证书)"]

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的核心技术围绕着本地证书的申请、颁发、存储、下载、安装、验证、更新和撤销的整个生命周期展开。

flowchart LR 申请 --> 颁发 --> 存储 --> 使用 --> 验证 --> 更新 --> 注销

证书首先要向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有六种类型,分别为:

  1. Data ---> 明文信息
  2. Signed-data ---> 数字签名
  3. Enveloped-data ---> 数字信封
  4. Signed-and-enveloped-data ---> 带签名的数字信封
  5. Digested-data ---> 信息摘要
  6. 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:证书拓展部分(可选)

posted @ 2022-04-09 13:46  lnjoy  阅读(1450)  评论(0编辑  收藏  举报