日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

证书体系: PFX 文件格式解析

發布時間:2024/7/23 编程问答 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 证书体系: PFX 文件格式解析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

原文同時發布于本人個人博客: https://kutank.com/blog/cert-pfx/

章節目錄

  • PFX 簡介
  • 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:

    // 生成 RSA Key pair openssl genrsa 2048 > private.pem // 使用 RSA Key pair 生成的私鑰創建一個 X509 證書 openssl req -x509 -new -key private.pem -out public.pem // 將我們上述兩步生成的證書和私鑰打包近 PFX 文件中 openssl pkcs12 -export -in public.pem -inkey private.pem -out mycert.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 }
  • version: 對于當前版本的 PFX 文件, 該版本號應該為 3(INTEGER). 當然, 隨著 PFX 格式的更新, 這個數值會在不同的定義中給出其他可選值.
  • authSafe: 它的類型為 ContentInfo, 該類型定義在 PKCS#7 規范中, 這里我們先不展開介紹. 在此處, 它的作用是用來存儲數據或者帶有簽名的數據. 在 PFX 中, 該 ContentInfo 中會包含一個 AuthenticatedSafe 類型的數據結構. 我們后邊再詳細介紹.
  • macData: 它是一個可選的字段. 該字段只在第二個字段 authSafe 中數據被使用密碼方式進行簽名的使用才會出現, 用來存儲使用密碼進行簽名的相關數據: MAC值 (Message Authentication Code), macSalt, iterationCount, 用來對 PFX 文件進行完整性檢查.
  • 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 }
  • contentType: 用來指明 content 字段中數據的類型. 它是一個 Object Identifier. 它的可選值為: data, signedData, envelopedData, signedAndEnvelopedData, digestedData, encryptedData. 在 PFX 中合法的類型只有兩個: data, signedData.
  • content: 用來存儲該字段實際保存的數據, 具體數據意義取決于 contentType. 在 PFX 中, 該字段直接或者間接的包含一個 AuthenticatedSafe 結構.
  • 下面我們看一下 AuthenticatedSafe 結構. RFC7292 給出的定義如下:

    AuthenticatedSafe ::= SEQUENCE OF ContentInfo-- Data if unencrypted-- EncryptedData if password-encrypted-- EnvelopedData if public key-encrypted

    AuthenticatedSafe 字段會包含一系列 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: 該類型中包含一個私鑰.
    KeyBag ::= PrivateKeyInfo
  • PKCS8ShroudedKeyBag: 該類型中包含一個 PKCS#8 格式的私鑰.
    PKCS8ShroudedKeyBag ::= EncryptedPrivateKeyInfo
  • CertBag: 該類型包含一個特定類型的證書.CertBag ::= SEQUENCE {certId BAG-TYPE.&id ({CertTypes}),certValue [0] EXPLICIT BAG-TYPE.&Type ({CertTypes}{@certId}) }x509Certificate BAG-TYPE ::={OCTET STRING IDENTIFIED BY {certTypes 1}}-- DER-encoded X.509 certificate stored in OCTET STRINGsdsiCertificate BAG-TYPE ::={IA5String IDENTIFIED BY {certTypes 2}}-- Base64-encoded SDSI certificate stored in IA5StringCertTypes BAG-TYPE ::= {x509Certificate |sdsiCertificate,... -- For future extensions }
  • CRLBag: 該類型包含了一個特定類型的 CRL(Certificate Revocation List).CRLBag ::= SEQUENCE {crlId BAG-TYPE.&id ({CRLTypes}),crlValue [0] EXPLICIT BAG-TYPE.&Type ({CRLTypes}{@crlId}) }x509CRL BAG-TYPE ::={OCTET STRING IDENTIFIED BY {crlTypes 1}}-- DER-encoded X.509 CRL stored in OCTET STRINGCRLTypes BAG-TYPE ::= {x509CRL,... -- For future extensions }
  • SecretBag: 該類型包含了一個用戶個人的密鑰(secret), 具體密鑰的意義取決于 secretTypeId 字段的值.SecretBag ::= SEQUENCE {secretTypeId BAG-TYPE.&id ({SecretTypes}),secretValue [0] EXPLICIT BAG-TYPE.&Type ({SecretTypes}{@secretTypeId}) }SecretTypes BAG-TYPE ::= {... -- For future extensions }
  • SafeContents: 該類型中可以包含任一上述的五種類型. 由此類型可以遞歸嵌套 SafeContents.
  • 至此, 一個PFX文件的結構就大體明了了.

    總結

    以上是生活随笔為你收集整理的证书体系: PFX 文件格式解析的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。