X.509證書解析和使用

一、概述

    常見的X.509證書格式包括:

    cer/crt是用於存放證書,它是2進制形式存放的,不含私鑰。

    pem跟crt/cer的區別是它以Ascii來表示,可以用於存放證書或私鑰。

    pfx/p12用於存放個人證書/私鑰,他通常包含保護密碼,2進制方式。

    p10是證書請求。

    p7r是CA對證書請求的回覆,只用於導入

    p7b以樹狀展示證書鏈(certificate chain),同時也支持單個證書,不含私鑰。

二、證書文件/私鑰文件

    在HTTPS通訊中最常用的是cer/crt和pem。下面以pem格式的證書爲例進行說明。下面是一個完整的PEM格式證書:

Certificate:

    Data:

         Version: 1 (0x0)

    Serial Number: 1 (0x1)

    Signature Algorithm: md5WithRSAEncryption

    Issuer: C=US, ST=Montana, L=Bozeman, O=sawtooth, OU=consulting, CN=www.sawtooth-consulting.com/[email protected]

    Validity

        Not Before: Jun 30 18:52:17 2010 GMT

        Not After : Mar 26 18:52:17 2013 GMT

    Subject: C=US, ST=Montana, L=Bozeman, O=yaSSL, OU=support, CN=www.yassl.com/[email protected]

    Subject Public Key Info:

    Public Key Algorithm: rsaEncryption

    RSA Public Key: (512 bit)

        Modulus (512 bit):

            00:c6:7b:c0:68:81:2f:de:82:3f:f9:ac:c3:86:4a:66:b7:ec:d4:f1:f6:64:21:ff:f5:a2:34:42:d0:38:9f:c6:dd:3b:6e:26:65:6a:54:96:dd:d2:7b:eb:36:a2:ae:7e:2a:9e:7e:56:a5:b6:87:9f:15:c7:18:66:7e:16:77:e2:a7

        Exponent: 65537 (0x10001)

    Signature Algorithm: md5WithRSAEncryption

        58:a9:98:e7:16:52:4c:40:e7:e1:47:92:19:1b:3a:8f:97:6c:7b:b7:b0:cb:20:6d:ad:b5:d3:47:58:d8:e4:f2:3e:32:e9:ef:87:77:e5:54:36:f4:8d:50:8d:07:b4:77:45:ea:9d:a4:33:36:9b:0b:e0:74:58:11:c5:01:7b:4d

-----BEGIN CERTIFICATE-----

MIICFDCCAb4CAQEwDQYJKoZIhvcNAQEEBQAwgZ4xCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdNb250YW5hMRAwDgYDVQQHEwdCb3plbWFuMREwDwYDVQQKEwhzYXd0b290aDETMBEGA1UECxMKY29uc3VsdGluZzEkMCIGA1UEAxMbd3d3LnNhd3Rvb3RoLWNvbnN1bHRpbmcuY29tMR0wGwYJKoZIhvcNAQkBFg5pbmZvQHlhc3NsLmNvbTAeFw0xMDA2MzAxODUyMTdaFw0xMzAzMjYxODUyMTdaMIGKMQswCQYDVQQGEwJVUzEQMA4GA1UECBMHTW9udGFuYTEQMA4GA1UEBxMHQm96ZW1hbjEOMAwGA1UEChMFeWFTU0wxEDAOBgNVBAsTB3N1cHBvcnQxFjAUBgNVBAMTDXd3dy55YXNzbC5jb20xHTAbBgkqhkiG9w0BCQEWDmluZm9AeWFzc2wuY29tMFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAMZ7wGiBL96CP/msw4ZKZrfs1PH2ZCH/9aI0QtA4n8bdO24mZWpUlt3Se+s2oq5+Kp5+VqW2h58VxxhmfhZ34qcCAwEAATANBgkqhkiG9w0BAQQFAANBAFipmOcWUkxA5+FHkhkbOo+XbHu3sMsgba2100dY2OTyPjLp74d35VQ29I1QjQe0d0XqnaQzNpsL4HRYEcUBe00=

-----END CERTIFICATE-----

     從Certificate開始到“-----BEGIN CERTIFICATE-----”爲止,中間的內容是證書的明文格式。

    從“-----BEGIN CERTIFICATE-----”開始到“-----END CERTIFICATE-----”爲止是證書的明文格式經過ASN.1編碼再經過Base64編碼得到的。

證書中包含的內容以及ASN.1編碼格式:

0_1285202578qbEw

    對於私鑰文件,真正的私鑰是包含在字符串"-----BEGIN PRIVATE KEY-----"和字符串"-----END PRIVATE KEY-----"之間。

如果該私鑰文件是pkcs8格式的,那麼該私鑰文件的格式爲

    PrivateKeyInfo ::= SEQUENCE {

        version Version(INTEGER),

        privateKeyAlgorithm PrivateKeyAlgorithmIdentifier (AlgorithmIdentifier),

        privateKey PrivateKey(OCTET STRING),

        attributes [0] IMPLICIT Attributes OPTIONAL(SET OF Attribute)

    }

    如果不是pkcs8格式的,那麼"-----BEGIN PRIVATE KEY-----"和"-----END PRIVATE KEY-----"之間的內容就是私鑰的Base64編碼。

    在客戶端或服務器在交換證書時,需要首先把Base64編碼轉換爲ASCII編碼再進行傳輸。

 

三、公鑰/私鑰

     公鑰和私鑰是證書文件和私鑰文件中最核心的內容。

     在SSL/TLS協議中需要是用公鑰算法,來進行對稱密鑰的交換。最常見的算法是RSA和DH,而RSA算法和DH算法的公鑰、私鑰的數據格式是不同的。

3.1 RSA算法

    RSA算法簡要描述如下:

        n = p *q; p,q爲互質的大素數

        (d * e) mod ( (p-1) * (q-1) ) = 1

        其中n,e爲公鑰,n,p,q,d,e自己保留。

    加密方法:

        Y(密文) = X(明文)**d mod n;

    解密方法:

        X(明文) = Y(密文)**e mod n;

 
    密鑰格式

        公鑰包含兩個整數:

            n RSA 合數模,是一個正整數

            e RSA 公開冪,是一個正整數

        私鑰有兩種表達方法,這兩種方法是等價的。

        1、

            n RSA 合數模,是一個正整數

            d RSA 私有冪,是一個正整數

        2、

            p 第一個因子,是一個正整數

            q 第二個因子,是一個正整數

            dP 第一個因子的CRT 冪,是一個正整數

            dQ 第二個因子的 CRT 冪,是一個正整數

            qInv (第一個)CRT 係數,是一個正整數

            對於RSA算法中的公鑰部分,包含兩個INTEGER類型的數字n和e。

            對於RSA私鑰的第一種表述方法,私鑰中包含5個INTEGER類型的數字依次爲n, e, d, p, q;對於RSA私鑰的第二種表達方法,私鑰中包含8個INTEGER類型的數字依次爲n, e, d, p, q, dP, dQ和qInv;

     交互方法:

SSL/TLS協議中,服務器端用Certificate消息把證書(公鑰)傳遞給客戶端,客戶端隨機生成48byte的預主密鑰,用公鑰加密傳遞給服務器端,作爲雙方對稱加密中一系列密鑰計算的基礎。如下圖:

1

3.2 DH算法

 
     算法原理:

          DH算法用於交換對稱密鑰,不能用於非對稱的加解密。

          DH算法簡要描述如下:

               一個素數q和一個整數a, 稱a是q的一個原根。

               雙方各自選定一個大數Xa和Xb,分別計算得到Ya = a**Xa mod q和Yb= a**Xb mod q;

              雙方交換Ya和Yb,保密Xa和Xb。

         計算對稱密鑰的方法:

              K = Ya**Xb mod q = Xb ** Ya mod q

    密鑰格式:

         DH算法的公鑰中包含了兩個整數:a和q,用於生成對稱密鑰

 
    交互方法

         服務器一端通過Certificate消息同步雙方的a和q。

         服務器緊接着選取Xa,計算得到Ya,並通過Server Key Exchange消息把Ya傳遞給客戶端。

         客戶端選取Xb,計算得到Yb,並通過Client Key Exchange消息把Yb傳遞給服務器端。

         雙方分別計算K = Ya**Xb mod q = Xb ** Ya mod q,得到相同的預主密鑰。

         如下圖:

1

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章