1. 程式人生 > 其它 >PKI體系與PKCS#7(Signed-data)結構

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的證書來給自己頒發證書。

1. 證書結構

最簡單的證書包含一個公鑰、名稱以及CA的數字簽名。

簽名時對證書上的所有其他資訊先計算雜湊值,然後對該雜湊值使用CA的私鑰進行簽名,得到簽名值再放在證書裡面。

驗籤時使用CA的公鑰解密簽名值,得到其他部分的雜湊值,再對證書上其他部分用同樣的HASH演算法進行計算,比對得到的雜湊值和解密的雜湊值,若相同則說明該證書內容沒有被篡改,該公鑰是合法的公鑰。

2. 證書格式

裝置支援三種檔案格式儲存證書

格式 描述
PKCS#12 以二進位制格式儲存證書,可以包含私鑰,也可以不包含私鑰。常用的字尾有:.P12和.PFX
DER 以二進位制格式儲存證書,不包含私鑰。常用字尾有:.DER、.CER和.CRT
PEM 以ASCII碼格式儲存證書,可以包含私鑰,也可以不包含私鑰。常用的字尾有:.PEM、 .CER和.CRT

這裡如果包含私鑰的話,證書是一個檔案,私鑰是另一個檔案,證書中不會包含私鑰。

三. PKI體系

公鑰基礎設施PKI(Public Key Infrastructure),是一種遵循既定標準的證書管理平臺,它利用公鑰技術能夠為所有網路應用提供安全服務。

1. PKI體系架構

一個PKI體系由終端實體、證書認證機構CA、證書註冊機構RA、證書/CRL(證書廢止列表)儲存庫四部分組成。

終端實體:向RA或CA申請證書、更新證書。

證書認證機構CA:負責頒發證書以及廢止證書,通過釋出證書或CRL資訊到儲存庫來進行釋出或廢止。

證書註冊機構RA:負責頒發證書,可分擔CA的壓力。

證書/CRL儲存庫:對終端實體開放,終端實體可以在儲存庫中下載所要通訊的目的端的公鑰資訊,即證書。此外終端實體還可以通過帶外載入的方式進行載入。

2. PKI生命週期

PKI的核心技術圍繞著本地證書的申請、頒發、儲存、下載、安裝、驗證、更新和撤銷的整個生命週期展開。

flowchart LR 申請 --> 頒發 --> 儲存 --> 使用 --> 驗證 --> 更新 --> 登出

證書首先要向CA申請,然後CA機構核實身份,頒發證書,儲存在儲存庫中。

使用者從儲存庫中下載證書,進行安裝,然後驗證證書有效期是否過期。

定期做更新,金鑰被竊取等情況也要做更新。

如果證書不需要用了,就向CA申請登出。

3. 證書申請

PKI終端實體生成一對公私鑰。

將公鑰和自己的身份資訊傳送給CA,CA核實PKI實體的身份,然後頒發證書。

私鑰PKI實體自己儲存,用來數字簽名和數字信封。

4. 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 ---> 加密資料

1. 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:簽名者資訊列表

(1) 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:沒有被簽名或認證的屬性集,這個欄位是可選的。

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