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:證書拓展部分(可選)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM