证书体系: PFX 文件格式解析
原文同時發布于本人個人博客: https://kutank.com/blog/cert-pfx/
章節目錄
2.1 最外層結構
2.2 AuthenticatedSafe 結構
參考 https://tools.ietf.org/html/rfc7292.
PFX 簡介##
以下引用自維基百科
在密碼學中,PKCS #12 定義了一種存檔文件格式,用于實現存儲許多加密對象在一個單獨的文件中。通常用它來打包一個私鑰及有關的 X.509 證書,或者打包信任鏈的全部項目。
一個 PKCS #12 文件通常是被加密的,同時單獨存在(存檔文件格式)。其被稱作"安全包裹"的內部存儲容器通常同時也被加密及單獨存在。一些安全包裹被預先定義用來存儲證書,私鑰以及證書吊銷列表。根據不同實現者的選擇,也可以使用一些安全包裹存儲其他任意數據。
PKCS #12 是 RSA 實驗室發布的公鑰密碼學標準之中的一員。
PKCS #12 文件擴展名為 ".p12 "或者 “.pfx”。
PFX 格式解析##
個人建議在閱讀文章時, 配合一個 PFX 文件會更加直觀.
使用openssl 生成一個 PFX:
如果你嘗試使用一個普通的文本編輯器打開該文件, 你會發現它的內容是這樣的:
建議在線 ASN.1解析器閱讀文件內容: https://lapo.it/asn1js/
PFX 文件的內容實際上是 ASN.1 編碼的數據. 更準確的說是 DER 編碼方式的 ASN.1. 它的整個文件內容就是一個 ASN.1 數據, 下面我們來看看它這個數據格式如何.
最外層結構
PFX 文件中整個 ASN.1 結構是由一層一層 ASN.1 結果嵌套而成, 我們首先看一下最外層結構,然后一步步深入.
RFC 7292 中給出的定義如下:
PFX ::= SEQUENCE {version INTEGER {v3(3)}(v3,...),authSafe ContentInfo,macData MacData OPTIONAL }MacData 的 RFC7292 中給出的定義如下:
MacData ::= SEQUENCE {mac DigestInfo,macSalt OCTET STRING,iterations INTEGER DEFAULT 1-- Note: The default is for historical reasons and its-- use is deprecated. }下面, 我們再深入的解析一下 authSafe 字段的結構.
AuthenticatedSafe 結構
上文中, 我們說 authSafe 字段的類型是 ContentInfo. 這里, 我們先看一下 ContentInfo 的結構. RFC 2315 中給出的定義如下:
ContentInfo ::= SEQUENCE {contentType ContentType,content[0] EXPLICIT ANY DEFINED BY contentType OPTIONAL }下面我們看一下 AuthenticatedSafe 結構. RFC7292 給出的定義如下:
AuthenticatedSafe ::= SEQUENCE OF ContentInfo-- Data if unencrypted-- EncryptedData if password-encrypted-- EnvelopedData if public key-encryptedAuthenticatedSafe 字段會包含一系列 ContentInfo 結構. 這些 ContentInfo 的 content 字段又會包含明文或者加密的 SafeContents 結構. 而 SafeContents 結構中由一系列 SafeBag 結構構成. SafeBag 存儲了數據信息,如 Key, Certificate, CRL 等. 而具體存儲哪種信息, 由 SafeBag 的 bagId 指明.
SafeContents ::= SEQUENCE OF SafeBagSafeBag ::= SEQUENCE {bagId BAG-TYPE.&id ({PKCS12BagSet})bagValue [0] EXPLICIT BAG-TYPE.&Type({PKCS12BagSet}{@bagId}),bagAttributes SET OF PKCS12Attribute OPTIONAL }PKCS12BagSet BAG-TYPE ::= {keyBag |pkcs8ShroudedKeyBag |certBag |crlBag |secretBag |safeContentsBag,... -- For future extensions }// 對于可選字段 bagAttributes, 這里不展開介紹, 感興趣的同學可以參考 RFC.RFC7292 中規定了六中可選的 SafeBag 類型:
bagtypes OBJECT IDENTIFIER ::= {pkcs-12 10 1}BAG-TYPE ::= TYPE-IDENTIFIERkeyBag BAG-TYPE ::={KeyBag IDENTIFIED BY {bagtypes 1}} pkcs8ShroudedKeyBag BAG-TYPE ::={PKCS8ShroudedKeyBag IDENTIFIED BY {bagtypes 2}} certBag BAG-TYPE ::={CertBag IDENTIFIED BY {bagtypes 3}} crlBag BAG-TYPE ::={CRLBag IDENTIFIED BY {bagtypes 4}} secretBag BAG-TYPE ::={SecretBag IDENTIFIED BY {bagtypes 5}} safeContentsBag BAG-TYPE ::={SafeContents IDENTIFIED BY {bagtypes 6}}下面我們再深入的看一下這六中 SafeBag.
KeyBag ::= PrivateKeyInfo
PKCS8ShroudedKeyBag ::= EncryptedPrivateKeyInfo
至此, 一個PFX文件的結構就大體明了了.
總結
以上是生活随笔為你收集整理的证书体系: PFX 文件格式解析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C语言学习及应用笔记之五:C语言type
- 下一篇: mysql stdistance_pos