天天看點

從零學習 CA 系列 (二) -- PKI 标準分類PKI 标準PKI 标準代碼示例

本文參考《PKI/CA 與數字證書技術大全》書籍,如有了解bug, 請大家指正。

PKI 标準

PKI 是 Public Key Infrastructure 的縮寫 ,其主要的功能是綁定證書持有者的身份和相關的秘鑰對(通過為公鑰及相關的使用者身份資訊簽發數字證書),為使用者提供友善的證書申請、證書廢棄、證書擷取、證書狀态查詢的途徑,并利用數字證書及相關的各種服務實作通信中各實體的身份認證、完整性、抗抵賴性和保密性。

根據數字證書格式及密碼管理方式的不同,PKI也包括很多模式,如x.509模式、PGP模式、IBE/CPK 模式、EMV模式等。x.509 模式的PKI也稱為 PKIX。由于 x.509 标準已經成為數字證書格式的事實标準,是以大部分情況下 PKI 特指 PKIX 。

PKI 體系架構主要包括三個部分:

1. 數字證書與私鑰

使用者或系統隻有擁有自己的公鑰和私鑰後,才能實作數字簽名和加解密功能。由于公鑰是随機生成的,是以從公鑰無法直接判定屬于哪個使用者。

為解決公鑰與使用者的映射關系,PKI 引入了數字證書,用于建立公鑰與使用者之間的對應關系。數字證書實際上是一種特殊的檔案格式,包含使用者身份資訊、使用者公鑰資訊和CA私鑰的數字簽名。X.509 标準規定了數字證書的具體格式。數字證書中隻包含公鑰,并不包含私鑰。由于數字證書中包含CA私鑰的數字簽名,是以數字證書具有防僞性。

2. 數字證書的管理

為解決數字證書的簽發問題,PKI引入CA,對數字證書進行集中簽發。CA也稱為認證中心。CA中心擁有自己的公鑰和私鑰,使用其私鑰給使用者簽發數字證書。

CA實際是一種特殊的公鑰管理中心,為實作數字證書的安全性,對數字證書的全生命周期進行管理,主要包括:數字證書的簽發和更新、數字證書的廢棄(登出、撤銷或吊銷)、數字證書的當機(挂失)和解凍、數字證書的查詢和下發、數字證書的狀态查詢等。

為了解決私鑰備份與恢複問題,PKI 引入 KMC (Key Management Center),用于對私鑰的全生命周期進行管理。使用者公私鑰對可由 KMC 産生,送出 CA 簽發數字證書後,将私鑰和數字證書同時安全的移交給使用者,而 KMC 将私鑰留作備份,可按需要給使用者恢複。

為防止使用者身份被冒用,應保證使用者私鑰的唯一性,不允許備份恢複。為防止公鑰加密後的資料無法解密,應提供使用者私鑰的備份恢複機制。為解決這兩種沖突的應用需求,PKI引入雙證書機制:簽名證書和加密證書。簽名證書及私鑰隻用于簽名驗證,不能用于加解密,該公私鑰對必須由使用者自己産生,KMC 不備份簽名私鑰。加密證書及私鑰隻用于加解密,不能用于簽名驗簽,該公私鑰對必須由KMC産生,且KMC對加密私鑰進行備份。

為保證CA系統安全的前提下,為友善證書業務遠端辦理、友善證書管理流程與應用系統結合,PKI引入了RA,專門用于對使用者提供面對面的證書業務服務,負責使用者證書辦理/廢棄申請、使用者身份稽核、制作證書并移交使用者等功能,而涉及證書簽發時則送出CA系統集中處理。

3. 數字證書的應用

基于數字證書可實作四種基本安全功能:身份認證、保密性、完整性和抗抵賴性。

基于證書接口中間件(子產品或元件),應用系統可以很友善地使用數字證書技術,進而提高應用系統的身份認證強度、保證應用系統中各種敏感資料的保密性、保證應用系統中各種敏感資料和交易記錄的完整性、使用者各種操作或交易的不可否定性。

從零學習 CA 系列 (二) -- PKI 标準分類PKI 标準PKI 标準代碼示例

PKI體系架構

如下是 雙證書技術流程圖:

從零學習 CA 系列 (二) -- PKI 标準分類PKI 标準PKI 标準代碼示例

雙證書技術流程圖

主分類為:國内标準和國際标準

  1. 國内标準 主要是國内制定的一套以 SM1, SM2, SM3, SM4 為基礎的算法标準
  2. 國際标準 即PKCS 系列,是公鑰密碼标準,由美國RSA實驗室與遍布全球的安全系統開發者一起合作制定的一組規範。PKCS系列主要包括如下标準:
  • PKCS#1: RSA Cryptography Standard (RSA密碼标準)
  • PKCS#2: 已撤銷,用以規範 RSA 加密摘要的轉換方式,已并入 PKCS#1中
  • PKCS#3: Diffie-Hellman Key Agreement Standard (DH秘鑰協商标準)
  • PKCS#4: 已撤銷,用以定義 RSA 秘鑰的格式,已并入 PKCS#1 中
  • PKCS#5: Password-Based Cryptography Standard (基于密碼的密碼标準)
  • PKCS#6: Extended-Certificate Syntax Standard (擴充證書文法标準)
  • PKCS#7: Cryptographic Message Syntax Standard (密碼消息文法标準)
  • PKCS#8: Private-Key Information Syntax Standard (私鑰資訊文法标準)
  • PKCS#9: Selected Attribute Type (可供選擇的屬性類型)
  • PKCS#10: Certification Request Syntax Standard (證書請求文法标準)
  • PKCS#11: Cryptography Token Interface Standard (密碼Token 接口标準)
  • PKCS#12: Personal Information Exchange Syntax Standard (個人資訊交換文法标準)
  • PKCS#13: Elliptic Curve Cryptography Standard (橢圓曲線密碼标準) 制定中;
  • PKCS#14: Pseudo-Random Number Generation(僞随機數生成算法PRNG)制定中;
  • PKCS#15: Cryptographic Token Information Format Standard (密碼Token資訊格式标準)

上述這些類型都使用通過 ASN.1 标準來完成資料格式的封裝的。

ASN.1 (Abstract Syntax Notation One) 即抽象文法描述語言的縮寫,是一種對分布計算機系統之間交換的資料消息進行抽象描述的規範化語言。它是一種國際标準,為抽象資料結構的描述說明定義了一種記法。ASN.1 使用抽象法對各種程式設計語言定義的資料類型進行重新定義,将所有資料分為兩大類:基礎類型和結構類型。詳情參見

ASN.1 基礎

代碼示例

// 初步建立 P10 資訊
    private byte[] prepP10Base64(UserInfo userInfo, String pubKey)
            throws InvalidKeySpecException, NoSuchAlgorithmException, IOException {
        PublicKey publicKey = toPublicKey(pubKey);
        // RSAEncryption
        ASN1ObjectIdentifier oid = new ASN1ObjectIdentifier("1.2.840.113549.1.1.1");
        SubjectPublicKeyInfo pKeyInfo = new SubjectPublicKeyInfo(
                mAlgorithmIdentifier = new AlgorithmIdentifier(oid), publicKey.getEncoded());
        // add user info into the pkcs 10 certification...
        X500NameBuilder x500NameBuilder = new X500NameBuilder();
        x500NameBuilder.addRDN(BCStyle.C, "CN");
        x500NameBuilder.addRDN(BCStyle.ST, "BeiJing");
        x500NameBuilder.addRDN(BCStyle.OU, "PERSON");
        x500NameBuilder.addRDN(BCStyle.NAME, "xxxxx");
        x500NameBuilder.addRDN(BCStyle.GENDER,  "F");
        x500NameBuilder.addRDN(BCStyle.TELEPHONE_NUMBER, "0000000000");
        x500NameBuilder.addRDN(BCStyle.EmailAddress, "[email protected]");
        mCertificationRequestInfo = new CertificationRequestInfo(x500NameBuilder.build(), pKeyInfo, null);
        return mCertificationRequestInfo.getEncoded();
    }

       /**
     * 建構 P10 證書請求資訊
     *
     * @param signedBuffer
     * @return 傳回證書 base64 格式資料
     * @throws IOException
     */
    private String genP10Base64(byte[] signedBuffer) throws IOException {
        CertificationRequest csr = new CertificationRequest(mCertificationRequestInfo,
                mAlgorithmIdentifier, new DERBitString(signedBuffer));
        return SecurityUtils.base64Encode(csr.getEncoded());
    }
           

注釋:

  • 先用 prepP10Base64 建構 P10 基礎資訊
  • 使用簽名私鑰進行簽名
  • 調用 genP10Base64 函數來建構 CertficationRequest 請求信的建構(Base64編碼)
下一篇: 安裝pip

繼續閱讀