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有六種型別,分別為:
- Data ---> 明文資訊
- Signed-data ---> 數字簽名
- Enveloped-data ---> 數字信封
- Signed-and-enveloped-data ---> 帶簽名的數字信封
- Digested-data ---> 資訊摘要
- 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:證書拓展部分(可選)