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