X.509系列(一):X.509 v3格式下的證書

X.509系列(一):X.509 v3格式下的證書

目前手頭上接到了一個新的任務(wù)妄讯,剛好又是和X.509證書打交道的工作亥贸,想到剛?cè)肼毜臅r候第一份正正經(jīng)經(jīng)的開發(fā)任務(wù)就是寫證書簽發(fā)工具,感覺這部分確實(shí)應(yīng)該踏踏實(shí)實(shí)做一下總結(jié)了朴摊。很難說以筆者現(xiàn)在的水平能不能證書這么一個基礎(chǔ)工具講清楚甚纲,盡力而為吧介杆。目前規(guī)劃為三部分內(nèi)容春哨,本文第一篇椰拒,剩下兩部分分別為:

  • ASN.1詳解

  • 密碼庫源碼分析(基于mbedtls庫)

證書的目的

我們公鑰證書可以說是PKI(Public Key Infrastructure)中非常核心的組件之一燃观,而PKI可以說是當(dāng)代互聯(lián)網(wǎng)文明安全的基石了仪壮。如果這方面的協(xié)議出現(xiàn)了漏洞积锅,可以說會對整個世界互聯(lián)網(wǎng)都造成非常嚴(yán)重的沖擊。筆者知識有限箫爷,所以本文對CA(Certificate Authority)將簡單抽象為單層級的一個證書頒發(fā)者虎锚。

證書(Certificate) 里面主要包含三個部分:證書信息(TBS Certificate)(TBS = To Be Signed)窜护,證書簽名算法(signature Algorithm)和證書簽名 (signatureValue). 證書信息里包含了證書的ID缓屠,證書擁有者的信息敌完,簽發(fā)者信息與最關(guān)鍵的滨溉,證書擁有者公鑰信息业踏。而證書的核心功能也是基于該公鑰信息展開腹尖。

想象兩個場景:

  • Alice和Bob進(jìn)行通信热幔,想要使用一條得到加密的數(shù)據(jù)傳輸通道绎巨,防止第三方竊聽
  • Alice給Bob發(fā)了個消息戈锻,但是他想要向Bob證明這條消息是自己發(fā)出的格遭,且沒有被別人篡改過

場景1:秘鑰協(xié)商

第一個場景下拒迅,可以把問題簡單的規(guī)約為Alice和Bob需要擁有同樣的對稱秘鑰,數(shù)據(jù)傳輸?shù)耐ǖ郎现粋鬏斢稍撁罔€加密過的數(shù)據(jù)前硫。但是對稱的秘鑰如何傳輸呢开瞭?非對稱密碼體系解決了這個問題个扰。在完成普通的握手之后:

  1. Alice和Bob分別將自己的證書發(fā)給對方

  2. Alice驗(yàn)證Bob的證書递宅,驗(yàn)證成功后提取Bob公鑰PUBKEY_B, 之后取隨機(jī)數(shù) r_A, 計算 s_A := PUBKEY_B(r_A)發(fā)送給Alice. PUBKEY_X(n)指使用X的公鑰對n完成加密/驗(yàn)簽操作. 對應(yīng)ECC可以視為n(PUBKEY_X), RSA可以視為n^{PUBKEY_X} \mod N

  3. Bob驗(yàn)證Alice的證書,驗(yàn)證成功后提取Alice公鑰PUBKEY_A, 之后取隨機(jī)數(shù) r_B, 計算 s_B := PUBKEY_A(r_B) 發(fā)送給Alice

  4. Alice和Bob分別用自己的私鑰從s_B/s_A中解出對應(yīng)的r_B/r_A, r_B := PRIKEY_A(s_B), r_A := PRIKEY_B(s_A),由于私鑰都是僅Alice和Bob各自擁有的英融,網(wǎng)絡(luò)上其他人無法解出驶悟,中間人的竊聽將失效(但是中間人攻擊依然是可能的痕鳍,許多https的抓包軟件就是基于中間人的攻擊。想想為啥)

  5. Alice和Bob拼接隨機(jī)數(shù)串 r = r_A | r_B抄邀,使用協(xié)定好的秘鑰派生算法境肾,將r 作為派生秘鑰的種子派生出相同的秘鑰,后期將使用該派生的秘鑰作為加密通信的秘鑰

其實(shí)上面的協(xié)議就是一個比較簡化版的SSL/TLS的握手階段环鲤,當(dāng)然秘鑰協(xié)商(DH: Diffie–Hellman key exchange)的方式還有很多, 但原理相差不多吵冒,會比直接加密簡單一點(diǎn)痹栖。包括當(dāng)前幾乎已經(jīng)是標(biāo)配的HTTPS協(xié)議揪阿,底層的安全基礎(chǔ)很大程度也是基于SSL的協(xié)議。

場景2:數(shù)字簽名

第二個場景就比較簡單了:

  • Alice會計算自己信息M的摘要值(Digest)溺健,選擇合適的padding方式,使用自己的私鑰對信息的摘要值計算簽名值Sig := PRIKEY_A(Pad(DIGEST(M))). 傳輸階段將自己的證書,簽名值與消息(Cert+Sig+M)一起打包發(fā)給Bob
  • Bob拿到這個包后首先需要驗(yàn)證Alice的證書琼开,驗(yàn)證成功后提取Alice的公鑰;之后計算M的摘要值D渣刷,之后使用公鑰計算D' := Depad(PUBKEY_A(Sig)), 最后判斷 D' ?= D,完成驗(yàn)簽操作

簡單來看碌嘀,消息的摘要值保證了消息的完整性Integrity股冗,而簽名的驗(yàn)證保證了消息是來自Alice的不可抵賴性Non-repudiation

好了烹棉,看完了上面的問題浆洗,有沒有一點(diǎn)疑問:那看起來證書好像只是個公鑰的殼子而已,為啥不直接發(fā)公鑰就完事了洛口?還有驗(yàn)證證書是什么意思第焰?

有沒有想過,上述的Bob和Alice都是所謂的"好人"而已湘纵,這網(wǎng)絡(luò)上哪有這么多好人。本質(zhì)上铺敌,公鑰其實(shí)只是一個很大的數(shù)偿凭,傳遞時也就是個二進(jìn)制流。假如互聯(lián)網(wǎng)上只有裸著的公鑰傳輸常挚,我怎么知道這個公鑰是誰發(fā)給我的,中間有沒有被別人給替換了吼过。

現(xiàn)實(shí)中我們證明自己是一個公民的辦法通常是去公安局去獲取自己的身份證酱床,通過身份證證明我是我,因?yàn)樯矸葑C上有我的名字罐寨、唯一身份證號鸯绿、照片等等,發(fā)證機(jī)關(guān)將在身份證蓋上國家神圣的公章舷手,證明身份證的真實(shí)性。那么在網(wǎng)絡(luò)世界中,我們也需要一張這樣的身份證,證明我是該公鑰的擁有人汇鞭,且公鑰的信息很有限,所以我們需要打包更多公鑰擁有者的信息读整,同時我們也需要一個組織來進(jìn)行發(fā)證操作强品,起到公安局的作用逻锐,并對證書"蓋上公章"晓淀。在這種場景下妆丘,網(wǎng)絡(luò)世界的證書自然就呼之欲出了勺拣。

證書的頒發(fā)

證書的申請文件

現(xiàn)實(shí)中我們?nèi)カ@取身份證時候,首先也要填一個申請表吧药有。我們在申請證書的時候同樣需要一個申請文件來發(fā)給網(wǎng)絡(luò)世界的公安局毅戈,CA。當(dāng)然愤惰,這個申請文件也是需要遵循格式標(biāo)準(zhǔn)的RFC 2986 - PKCS #10: Certification Request Syntax Specification苇经,縮寫為.csr

通過OpenSSL可以自己造一個合法格式的csr文件:

正如申請身份證需要先造個人宦言,首先我們需要自己造一個公鑰扇单,即制造一對公私鑰對,以RSA-2048為例奠旺,生成pem格式:

pwner@pwner:~$ openssl genrsa -out rsa_private.pem 2048
Generating RSA private key, 2048 bit long modulus (2 primes)
.........................................+++++
.........................................................+++++
e is 65537 (0x010001)
pwner@pwner:~$ openssl rsa -in rsa_private.pem -pubout -out rsa_public.pem

pwner@pwner:~$ cat rsa_public.pem rsa_private.pem 
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA6A5bWFoO3bU8apnV6Q4r
SmosNvx28JSLz5gdwtrAHTjzqLn7yXu56kp/j8wZEKhe0jgKNCAGIwbY3begyAav
ixZY4XUa647L4wtJ9lJzUTVcFdZ2g/WsmQXVY3ssa3NYL7SDnlBxffdrT8s0yRV4
Ojo4CqgJ926qEZERUxnuv5cgf7l3cfbZUoZzgcdw5XF+Mu98y+yvnrqnihfO2DGU
HTWCRI93NkCpZRngPWElT1XR8kxSIuquJW54RgFE1RK6v7S8RVHvtwIqpvYV4D/u
OgxktmwAblxwF65uPklLgVlNfxKMhFnQoF77vSPdWWaB0x8CQsn+5q4KhGARaT5z
fQIDAQAB
-----END PUBLIC KEY-----
-----BEGIN RSA PRIVATE KEY-----
MIIEpgIBAAKCAQEA6A5bWFoO3bU8apnV6Q4rSmosNvx28JSLz5gdwtrAHTjzqLn7
yXu56kp/j8wZEKhe0jgKNCAGIwbY3begyAavixZY4XUa647L4wtJ9lJzUTVcFdZ2
g/WsmQXVY3ssa3NYL7SDnlBxffdrT8s0yRV4Ojo4CqgJ926qEZERUxnuv5cgf7l3
cfbZUoZzgcdw5XF+Mu98y+yvnrqnihfO2DGUHTWCRI93NkCpZRngPWElT1XR8kxS
IuquJW54RgFE1RK6v7S8RVHvtwIqpvYV4D/uOgxktmwAblxwF65uPklLgVlNfxKM
hFnQoF77vSPdWWaB0x8CQsn+5q4KhGARaT5zfQIDAQABAoIBAQCDaxYKLD59CtWj
XWnKaa7UntpZbZMCXm3rbC92maHxKr67EFDq4zn/2J7zVdfgGipRDVGiAXzYO1l3
/zV78mVZ9JbzX/mV67HF7C+/4yPRmtGCwIkv5GMR6j7V7vzSAWmw4p8jelU7zHIm
p2NGefUzrKLuTgoO6cpA1pIkKOyP7TclGp9vTGh1MoE2rZjLggo+ESQuLX/GKDAH
pV3NamiAgJtrfqTKoI/AnDcGhhy46np/Cwb4ENkFFJ6oHOYgyXexlBCQmjXfaQyp
T45uGjuKi45r9c5mvP0Z7uejCKWPs6LjXye3SN2XtWFRJdADBMH+YMqHax8N3IPm
4cUz3l+hAoGBAP+vkZ2+qSECMjudymz9yEiSrrIAnG2G5gCTNsnannXMNzBOOgIb
mpvGY8okLeA7pHsOYdyvnCvbRuA6mhtL+tFn84PjQem6Z18KyqwCvHWzsnvrcjbx
yiBnSwsyfbfXQqdGhfs62Vko+6OxXSDB10uyHGiga7C26N8HY1F791UlAoGBAOhX
WtNx5xubEgGumKPNNdSD/5Toq+Cz+eIuLiTfR4zZYGcjBawcESzkV3EM6HN/LL8N
bZ1DFKxIMsGAECmkImKtEkWEpeqJkatjsQbDvzSX0mUPrE4fFJQF3JzzauXKUayC
51S0GS9EN0FLYk0mjXyrJcHaHcFqgVW0eQ/7RNF5AoGBANuLFFy/hpfKO/nGrjbR
3rS6BnjfX3IIX9vkjCncpy18sXKv6M1AiIvzWGIMmLuuWrgzDEKjI1ThDsWgbAy+
O9qtCIKZk1Iu9W29ZXM3Uj06lCola8fT63vRVbWCoEJH+nqJaqfiyxfswc23kMB8
0PG1OQF5pZ5yIBjJTjV8XU5lAoGBAL+M3W2712x0AXlvh5psIfguRzVuSd38o4Rs
zFBL4MJnqMn/HrsRfLuFGe4zVSV7cNmmaXuhBVcwQuAzA6BBGLQ/ufOkc+GUP4uM
qjNIiMgEb0owjL7vctjCqGqhaL1Aeut+FNhJjwXf+KoVS1sN8NIajAtxFt0SQMT3
AGRDpS4JAoGBAK6hrYUVDDLEDfvfCH8ItOGYozPdDDvJbiZQMdK9tXSnpfoOGOXK
9ofPPSrBoAIt7O0RR5fBR3di8fZbVGJRd2NUsnbFhlj4KBVKusYRjeTl5PcNI6G0
P8wd5+pqIdwAVN77S5MeusApw8A2+L67odt6xzHGugR3pcBzGONUsD3C
-----END RSA PRIVATE KEY-----

生成csr文件蜘澜,輸入自己的公鑰與私鑰,通常還會讓你輸入自己的個人信息响疚。使用PKCS#10的標(biāo)準(zhǔn)將信息與公鑰打包后鄙信,由自己私鑰進(jìn)行自簽名:

pwner@pwner:~/X509_learning$ openssl req -new -in rsa_public.pem -key rsa_private.pem -out rsa_public.csr.pem
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:CN
State or Province Name (full name) [Some-State]:GD
Locality Name (eg, city) []:SZ
Organization Name (eg, company) [Internet Widgits Pty Ltd]:xxxx
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:xxxx
Email Address []:xxxx

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:


pwner@pwner:~/X509_learning$ cat rsa_public.csr.pem 
-----BEGIN CERTIFICATE REQUEST-----
MIICtTCCAZ0CAQAwcDELMAkGA1UEBhMCQ04xCzAJBgNVBAgMAkdEMQswCQYDVQQH
DAJTWjEPMA0GA1UECgwGSFVBV0VJMREwDwYDVQQDDAhTSFVBSUhVQTEjMCEGCSqG
SIb3DQEJARYUc2h1YWlodWEyQGh1YXdlaS5jb20wggEiMA0GCSqGSIb3DQEBAQUA
A4IBDwAwggEKAoIBAQDoDltYWg7dtTxqmdXpDitKaiw2/HbwlIvPmB3C2sAdOPOo
ufvJe7nqSn+PzBkQqF7SOAo0IAYjBtjdt6DIBq+LFljhdRrrjsvjC0n2UnNRNVwV
1naD9ayZBdVjeyxrc1gvtIOeUHF992tPyzTJFXg6OjgKqAn3bqoRkRFTGe6/lyB/
uXdx9tlShnOBx3DlcX4y73zL7K+euqeKF87YMZQdNYJEj3c2QKllGeA9YSVPVdHy
TFIi6q4lbnhGAUTVErq/tLxFUe+3Aiqm9hXgP+46DGS2bABuXHAXrm4+SUuBWU1/
EoyEWdCgXvu9I91ZZoHTHwJCyf7mrgqEYBFpPnN9AgMBAAGgADANBgkqhkiG9w0B
AQsFAAOCAQEA5FHk/AAEmiR58aHZJ9dAFMtxEAm4x9WYpxcfzFrXt1h35QFLK3D5
3SkZlTeRNfH3r4eNYit8Hm3efqsfQXfgcuO5RTS4lU7DcAdsgExddxd52NojfnxP
qMfBQNZTuglVLGZ3o3O/HQ0YvJjkcLyIyFyU1YwVzWkts/QHKmU2mtyrLN4piolv
nZlTSX3qeUio218nwEmXzztcZBR51Z3hriUSIP/+rBWJlZEP+0sTaOmG46gQwS7r
jxif4CcoCwPDd8+GeiSSbWHZzNYRISVtQcLHVsUAq6iro3YiQygPBLF4bwa4c8kX
bcqeI/q36J+2myc/alFWDGjEsE/6zh6c7w==
-----END CERTIFICATE REQUEST-----

-in選項(xiàng)輸入公鑰,-key輸入私鑰忿晕,-out為輸出csr文件名装诡。-new表示新建一個csr。運(yùn)行命令行后然后會讓你輸入的個人信息。此處拆分主要為了闡述csr的生成流程慎王。

pwner@pwner:~/X509_learning$ openssl req -new -nodes -sha256 -newkey rsa:2048 -keyout rsa_private.pem -out rsa_public.csr.pem

但是上面的打印啥也看不出來蚓土,我們需要用解析完的方式來查看該文件:

pwner@pwner:~/X509_learning$ openssl req -in rsa_public.csr.pem -noout -text
Certificate Request:
    Data:
        Version: 1 (0x0)
        Subject: C = CN, ST = GD, L = SZ, O = xxxx, CN = xxxx, emailAddress = xxxx
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                RSA Public-Key: (2048 bit)
                Modulus:
                    00:e8:0e:5b:58:5a:0e:dd:b5:3c:6a:99:d5:e9:0e:
                    2b:4a:6a:2c:36:fc:76:f0:94:8b:cf:98:1d:c2:da:
                    c0:1d:38:f3:a8:b9:fb:c9:7b:b9:ea:4a:7f:8f:cc:
                    19:10:a8:5e:d2:38:0a:34:20:06:23:06:d8:dd:b7:
                    a0:c8:06:af:8b:16:58:e1:75:1a:eb:8e:cb:e3:0b:
                    49:f6:52:73:51:35:5c:15:d6:76:83:f5:ac:99:05:
                    d5:63:7b:2c:6b:73:58:2f:b4:83:9e:50:71:7d:f7:
                    6b:4f:cb:34:c9:15:78:3a:3a:38:0a:a8:09:f7:6e:
                    aa:11:91:11:53:19:ee:bf:97:20:7f:b9:77:71:f6:
                    d9:52:86:73:81:c7:70:e5:71:7e:32:ef:7c:cb:ec:
                    af:9e:ba:a7:8a:17:ce:d8:31:94:1d:35:82:44:8f:
                    77:36:40:a9:65:19:e0:3d:61:25:4f:55:d1:f2:4c:
                    52:22:ea:ae:25:6e:78:46:01:44:d5:12:ba:bf:b4:
                    bc:45:51:ef:b7:02:2a:a6:f6:15:e0:3f:ee:3a:0c:
                    64:b6:6c:00:6e:5c:70:17:ae:6e:3e:49:4b:81:59:
                    4d:7f:12:8c:84:59:d0:a0:5e:fb:bd:23:dd:59:66:
                    81:d3:1f:02:42:c9:fe:e6:ae:0a:84:60:11:69:3e:
                    73:7d
                Exponent: 65537 (0x10001)
        Attributes:
            a0:00
    Signature Algorithm: sha256WithRSAEncryption
         e4:51:e4:fc:00:04:9a:24:79:f1:a1:d9:27:d7:40:14:cb:71:
         10:09:b8:c7:d5:98:a7:17:1f:cc:5a:d7:b7:58:77:e5:01:4b:
         2b:70:f9:dd:29:19:95:37:91:35:f1:f7:af:87:8d:62:2b:7c:
         1e:6d:de:7e:ab:1f:41:77:e0:72:e3:b9:45:34:b8:95:4e:c3:
         70:07:6c:80:4c:5d:77:17:79:d8:da:23:7e:7c:4f:a8:c7:c1:
         40:d6:53:ba:09:55:2c:66:77:a3:73:bf:1d:0d:18:bc:98:e4:
         70:bc:88:c8:5c:94:d5:8c:15:cd:69:2d:b3:f4:07:2a:65:36:
         9a:dc:ab:2c:de:29:8a:89:6f:9d:99:53:49:7d:ea:79:48:a8:
         db:5f:27:c0:49:97:cf:3b:5c:64:14:79:d5:9d:e1:ae:25:12:
         20:ff:fe:ac:15:89:95:91:0f:fb:4b:13:68:e9:86:e3:a8:10:
         c1:2e:eb:8f:18:9f:e0:27:28:0b:03:c3:77:cf:86:7a:24:92:
         6d:61:d9:cc:d6:11:21:25:6d:41:c2:c7:56:c5:00:ab:a8:ab:
         a3:76:22:43:28:0f:04:b1:78:6f:06:b8:73:c9:17:6d:ca:9e:
         23:fa:b7:e8:9f:b6:9b:27:3f:6a:51:56:0c:68:c4:b0:4f:fa:
         ce:1e:9c:ef

這就有那味兒了,簡單解析一下赖淤,順便對應(yīng)著RFC的標(biāo)準(zhǔn)看一下蜀漆。先看Data這段,對應(yīng)的是 CertificationRequestInfo

   CertificationRequestInfo ::= SEQUENCE {
        version       INTEGER { v1(0) } (v1,...),
        subject       Name,
        subjectPKInfo SubjectPublicKeyInfo{{ PKInfoAlgorithms }},
        attributes    [0] Attributes{{ CRIAttributes }}
   }

順便提一下咱旱,RFC的標(biāo)準(zhǔn)都是使用ASN.1格式描述的确丢,而日常使用中的證書等文件同樣是基于ASN.1BER格式,而PEM是對文件進(jìn)行標(biāo)識(如-----BEGIN CERTIFICATE REQUEST-----)后吐限,進(jìn)行base64編碼的產(chǎn)物鲜侥。ASN.1的具體細(xì)節(jié)將在(二)部分進(jìn)行分析。

可以發(fā)現(xiàn)生成的csrdata部分是可以和CertificationRequestInfo一一對應(yīng)起來的:

version:csr的版本號诸典,當(dāng)前通常是version 1描函,即0

subject:以Name的格式保存,一般會保存證書持有者的國籍(C:Country 兩個字母表示狐粱,如美國US舀寓,中國CN), 省級行政區(qū)(ST: State or Province),城市(L:Locality), 公司組織名(O:Organization), 組織部門名(OU: Organization Unit), 通用名(CN: Common Name), email地址等等肌蜻。其實(shí)具體的規(guī)范還是比較復(fù)雜的互墓,具體標(biāo)準(zhǔn)參考X.501規(guī)范。此處不細(xì)說了

subjectPKInfo: 最關(guān)鍵的部分蒋搜,包含了公鑰的信息篡撵,由公鑰算法與公鑰值組成:

   SubjectPublicKeyInfo { ALGORITHM : IOSet} ::= SEQUENCE {
        algorithm        AlgorithmIdentifier {{IOSet}},
        subjectPublicKey BIT STRING
   }

順便提一句,AlgorithmIdentifier的標(biāo)識是ANS.1編碼中最與眾不同的方式豆挽,Object ID. 后續(xù)將提到育谬。此處算法被標(biāo)記為了rsaEncrypt

最后是attributes,他主要提供了一些證書申請者的附加信息帮哈。PKCS#9中定義了一些在此可能使用的屬性類型斑司,典型的例子是challenge-password屬性:它將指定一個密碼,實(shí)體可以通過該密碼請求吊銷證書但汞;另一個例子是X.509證書擴(kuò)展中顯示的信息(例如。從PKCS #9獲取的extensionRequest屬性等)私蕾。此處a0:00標(biāo)識了NULL

   Attribute { ATTRIBUTE:IOSet } ::= SEQUENCE {
        type   ATTRIBUTE.&id({IOSet}),
        values SET SIZE(1..MAX) OF ATTRIBUTE.&Type({IOSet}{@type})
   }

再看完整的csr結(jié)構(gòu):

   CertificationRequest ::= SEQUENCE {
        certificationRequestInfo CertificationRequestInfo,
        signatureAlgorithm AlgorithmIdentifier{{ SignatureAlgorithms }},
        signature          BIT STRING
   }

certificationRequestInfo對應(yīng)的就是上面的Data,已完成解釋

signatureAlgorithm對應(yīng)簽名算法斤富,此處為sha256WithRSAEncryption,指的是使用待簽名的公鑰對應(yīng)的私鑰,來完成自簽名,簽名的對象是certificationRequestInfosha256摘要值看峻,簽名算法為RSA

最后signature對應(yīng)的就是簽名值了,bit string類型

最后提一點(diǎn)灼狰,在證書申請的模式下蝴簇,申請者只需要將公鑰信息發(fā)至證書簽發(fā)機(jī)構(gòu)即可吸重,保證了私鑰的本地性與私密性寄猩。

CA

完成了申請表的填寫斯辰,就應(yīng)該交給身份證辦理人員了,類比下來csr文件生成之后蒲跨,我們就要向CA發(fā)送證書申請文件巡语,以獲取證書枢赔。

CA可以翻譯為數(shù)字證書認(rèn)證機(jī)構(gòu)执隧,是PKI體系中的基石烁设。維基百科于是說:

CA是證書的簽發(fā)機(jī)構(gòu)挽鞠,它是PKI的核心疚颊。CA是負(fù)責(zé)簽發(fā)證書、認(rèn)證證書信认、管理已頒發(fā)證書的機(jī)關(guān)材义。它要制定政策和具體步驟來驗(yàn)證、識別用戶身份嫁赏,并對用戶證書進(jìn)行簽名其掂,以確保證書持有者的身份和公鑰的擁有權(quán)。

由上文可以推斷潦蝇,CA正是承擔(dān)了公安局對身份證"蓋章"這一工作款熬,蓋上的便是使用CA私鑰完成的對證書的數(shù)字簽名。但是公安局的信用是有國家背書的护蝶,所以CA也必須得到網(wǎng)絡(luò)上所有人的信任华烟。當(dāng)然擁有CA資格的機(jī)構(gòu)也是相當(dāng)有限的。

CA獲取證書申請之后持灰,首先就要檢測csr的合法性盔夜,申請人信息的合法性,公鑰的合法性等等堤魁。這些屬于審批的范疇喂链,技術(shù)范疇的話就是需要校驗(yàn)csr的簽名,即certificationRequestInfo是否被篡改妥泉。過程為取出certificationRequestInfo中的公鑰信息椭微,計算certificationRequestInfo的待驗(yàn)證哈希值。利用提取的公鑰與簽名計算出簽名哈希值盲链,解padding后蝇率,判斷是否與待驗(yàn)證哈希值一致迟杂,確定該csr的完整性與不可抵賴性。

CA在完成驗(yàn)證后本慕,將下發(fā)自己的CA證書以及簽發(fā)的X.509證書排拷。CA同樣是一張X.509格式的證書,往往也是一張自簽名的證書锅尘,即CA私鑰簽發(fā)CA公鑰监氢。事實(shí)上,當(dāng)前網(wǎng)絡(luò)通訊當(dāng)中(特別是瀏覽器)將會內(nèi)置上很多權(quán)威受信任的CA證書藤违,若通信過程中使用的CA證書并不在內(nèi)置名單中浪腐,往往程序會進(jìn)行提醒:當(dāng)前站點(diǎn)CA證書不受信任。而且現(xiàn)在CA往往由于需要加快簽發(fā)速率等原因顿乒,會使用多級CA的模式议街,即CA證書由上級CA簽發(fā),最后將校驗(yàn)鏈上的證書一并發(fā)送給申請者淆游,后續(xù)校驗(yàn)時將進(jìn)行證書的逐級校驗(yàn)傍睹。

還記得上面場景中提到的:Alice驗(yàn)證Bob的證書這一步嗎?Alice正是通過CA證書中的公鑰來校驗(yàn)Bob證書簽名的犹菱。原因正是基于CA是Alice所信任的證書認(rèn)證者拾稳。當(dāng)然驗(yàn)證證書還需要對certificateInfo校驗(yàn),確定Bob的身份腊脱,下章就會講到访得。

X.509

終于到了重頭戲,我們的主角陕凹,X.509格式的證書悍抑。再強(qiáng)調(diào)一次,證書是功能性的描述杜耙,而X.509只是證書一種國際上通用的格式搜骡,基于RFC3280: Internet X.509 Public Key Infrastructure Certificate and CRL Profile(X.509 v3), 對應(yīng)了PKCS#12

這次我們直接拿上一張Google的證書來看看:

Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            bc:01:41:05:22:d8:cc:7f:02:00:00:00:00:79:64:7f
        Signature Algorithm: sha256WithRSAEncryption
        Issuer: C = US, O = Google Trust Services, CN = GTS CA 1O1
        Validity
            Not Before: Aug 26 08:14:23 2020 GMT
            Not After : Nov 18 08:14:23 2020 GMT
        Subject: C = US, ST = California, L = Mountain View, O = Google LLC, CN = www.google.com
        Subject Public Key Info:
            Public Key Algorithm: id-ecPublicKey
                Public-Key: (256 bit)
                pub:
                    04:bc:1c:aa:96:6f:6f:99:48:79:56:61:4b:7f:ff:
                    dc:39:08:3a:d4:4d:e2:d8:87:80:af:3d:18:5e:71:
                    2d:ce:09:70:57:39:38:5f:2a:ee:a8:35:f4:3a:86:
                    86:5a:1d:c7:31:32:1b:8d:ac:d0:46:ad:c3:fc:a5:
                    d3:18:36:68:ab
                ASN1 OID: prime256v1
                NIST CURVE: P-256
        X509v3 extensions:
            X509v3 Key Usage: critical
                Digital Signature
            X509v3 Extended Key Usage: 
                TLS Web Server Authentication
            X509v3 Basic Constraints: critical
                CA:FALSE
            X509v3 Subject Key Identifier: 
                AF:32:A8:9D:20:98:F3:FD:14:41:FE:F4:C4:74:47:7C:D1:6C:81:B1
            X509v3 Authority Key Identifier: 
                keyid:98:D1:F8:6E:10:EB:CF:9B:EC:60:9F:18:90:1B:A0:EB:7D:09:FD:2B

            Authority Information Access: 
                OCSP - URI:http://ocsp.pki.goog/gts1o1core
                CA Issuers - URI:http://pki.goog/gsr2/GTS1O1.crt
    
            X509v3 Subject Alternative Name: 
                DNS:www.google.com
            X509v3 Certificate Policies: 
                Policy: 2.23.140.1.2.2
                Policy: 1.3.6.1.4.1.11129.2.5.3
    
            X509v3 CRL Distribution Points: 
    
                Full Name:
                  URI:http://crl.pki.goog/GTS1O1core.crl
    
            CT Precertificate SCTs: 
                Signed Certificate Timestamp:
                    Version   : v1 (0x0)
                    Log ID    : 5E:A7:73:F9:DF:56:C0:E7:B5:36:48:7D:D0:49:E0:32:
                                7A:91:9A:0C:84:A1:12:12:84:18:75:96:81:71:45:58
                    Timestamp : Aug 26 09:14:24.417 2020 GMT
                    Extensions: none
                    Signature : ecdsa-with-SHA256
                                30:45:02:20:77:F3:D6:8B:51:4F:88:71:16:73:ED:36:
                                2F:64:F4:77:3E:92:D3:CE:97:1F:1C:53:FA:4E:FB:5B:
                                D7:0A:4C:D6:02:21:00:9F:B9:FE:F1:F3:1C:0D:CF:20:
                                30:B1:1C:0A:01:65:AD:67:90:1F:B5:33:90:8D:49:4D:
                                2B:ED:1D:90:28:A1:6B
                Signed Certificate Timestamp:
                    Version   : v1 (0x0)
                    Log ID    : 07:B7:5C:1B:E5:7D:68:FF:F1:B0:C6:1D:23:15:C7:BA:
                                E6:57:7C:57:94:B7:6A:EE:BC:61:3A:1A:69:D3:A2:1C
                    Timestamp : Aug 26 09:14:24.367 2020 GMT
                    Extensions: none
                    Signature : ecdsa-with-SHA256
                                30:45:02:21:00:F4:67:8E:8B:ED:3F:B2:D4:EA:72:EB:
                                53:F1:52:57:98:D6:63:0E:C0:6B:68:46:CE:F3:AD:25:
                                52:AD:12:83:27:02:20:05:CA:04:76:D6:4F:2A:E5:D3:
                                96:85:79:A2:F3:85:29:9E:89:30:00:A7:20:99:2D:F7:
                                C9:56:3C:4E:5D:5C:CF
    Signature Algorithm: sha256WithRSAEncryption
         7a:9a:76:80:c9:39:13:8e:60:b1:93:5d:99:49:1b:71:b5:b2:
         2e:bd:4b:db:56:f0:eb:fa:f4:ae:93:f6:1b:dd:b0:df:2a:81:
         08:fc:4a:a9:ec:b1:ae:09:f0:fa:40:7b:b8:be:dc:08:4c:46:
         32:99:29:f8:13:6b:72:af:16:79:63:d3:3f:76:56:57:19:78:
         91:86:f8:7a:ee:26:67:98:dc:5e:e4:00:f5:87:a0:01:21:9d:
         cf:e5:9f:02:f3:2a:fd:0e:fd:78:af:2e:20:29:77:35:e2:c6:
         30:ee:ef:be:f2:bb:26:02:52:a2:2d:27:78:ce:a9:8e:39:d0:
         a2:74:90:11:c5:92:58:3c:7a:88:1d:c7:5a:56:d4:1a:01:00:
         c3:9d:98:6f:41:02:1f:cb:e2:4d:99:6a:5c:d9:0f:c0:88:08:
         15:c5:26:90:a2:a4:15:f6:71:e2:fe:a9:98:dc:40:2a:71:c1:
         11:aa:00:73:52:24:74:aa:ae:72:55:2f:0d:31:b7:00:bb:1f:
         87:4d:f5:05:ad:ff:7a:93:e0:cf:86:a5:1d:1b:7d:41:fa:10:
         99:3b:00:7c:c9:dd:a9:52:5c:06:72:86:96:e7:05:97:77:12:
         2f:26:bb:dc:65:c4:48:4d:9c:82:4b:7d:69:27:3f:85:00:2e:
         b1:5d:8d:dc

同樣對照標(biāo)準(zhǔn)定義進(jìn)行學(xué)習(xí)字段的意義:

   Certificate  ::=  SEQUENCE  {
        tbsCertificate       TBSCertificate,
        signatureAlgorithm   AlgorithmIdentifier,
        signatureValue       BIT STRING  }

可以看到Data對應(yīng)了tbsCertificate, 也是整張證書最關(guān)鍵的部分佑女,該字段包含證書擁有者信息记靡、頒發(fā)者信息、公鑰信息团驱、有效期信息等摸吠,后面單獨(dú)拿出來詳細(xì)解析。

剩下的兩個部分與csr完全一致嚎花,同樣是表明了簽名的算法與tbsCertificate的簽名寸痢。這里要注意,簽發(fā)者issuer信息表明了證書簽發(fā)人紊选,一般為受信任的CA啼止。

TBSCertificate

核心字段道逗,一點(diǎn)點(diǎn)手撕;先看定義

   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,
                             -- If present, version shall be v2 or v3
        subjectUniqueID [2]  IMPLICIT UniqueIdentifier OPTIONAL,
                             -- If present, version shall be v2 or v3
        extensions      [3]  EXPLICIT Extensions OPTIONAL
                             -- If present, version shall be v3
        }
       Version  ::=  INTEGER  {  v1(0), v2(1), v3(2)  }

   CertificateSerialNumber  ::=  INTEGER

   Validity ::= SEQUENCE {
        notBefore      Time,
        notAfter       Time }

   Time ::= CHOICE {
        utcTime        UTCTime,
        generalTime    GeneralizedTime }

   UniqueIdentifier  ::=  BIT STRING

   SubjectPublicKeyInfo  ::=  SEQUENCE  {
        algorithm            AlgorithmIdentifier,
        subjectPublicKey     BIT STRING  }

這里順便提一句ASN.1下的定義中SEQUENCESET的區(qū)別在于:通常SEQUENCE是一個有序集合献烦,即編碼時必須按照順序排列憔辫,SET則可以為無序的集合。通常解析SEQUENCE時都將按序解析仿荆。

versionX.509標(biāo)準(zhǔn)下版本,例子中證書為0x2坏平,即v3版本拢操。注意證書存在extensions時,版本一定是v3版本舶替,故extension通常也稱為X.509 v3 extension令境。

serialNumber:證書的序列號,它必須是一個唯一整數(shù)顾瞪。需要注意一點(diǎn)舔庶,他是一個大端數(shù)字,所以有時候他可能高位填一些0陈醒,但不影響其對比。比如例子中的證書,實(shí)際編碼中高位填上了0:

/* 解析結(jié)果 */
Serial Number:
    bc:01:41:05:22:d8:cc:7f:02:00:00:00:00:79:64:7f
        
/* 編碼 */        
Tag:[02] Length:[11] Value:[00 BC 01 41 05 22 D8 CC 7F 02 00 00 00 00 79 64 7F] 

序列號的作用主要在CRL中體現(xiàn)唯一標(biāo)識的作用拟烫〗埃可以對照到身份證上的身份證號:)

signature: 標(biāo)記了證書的簽名算法,與csr一樣爷辙,不做贅述彬坏。

issuer:標(biāo)記證書簽發(fā)者CA的信息,例子中可以看到為Google Trust Services簽發(fā)膝晾。具體格式類似上面的subject栓始。

validity:標(biāo)識了證書的生效時間,以起始時間與結(jié)束時間表述血当』米可以看到例子中的證書的生效起始時間為格林威治時間的2020/08/26, 有效期至2020/11/18。時間的ASN.1通常以 YYMMDDHHMMSS來標(biāo)識歹颓,結(jié)尾以Z或者時區(qū)差標(biāo)識時區(qū)坯屿。ZZulu時間的意思,和格林威治時間同步巍扛。

subject:證書擁有者信息领跛,同issuer。上面提到校驗(yàn)Bob的信息撤奸,也就是對這一段的驗(yàn)證吠昭。

subjectPublicKeyInfo:證書公鑰信息喊括,也和csr中的一致。

UniqueID:可選字段矢棚,這個字段必須要v2及以上版本才有郑什,主要是用來防止issuersubject重名的情況。例子中的證書是沒有的

Extension

extension是最重頭戲的字段:

   Extensions  ::=  SEQUENCE SIZE (1..MAX) OF Extension

   Extension  ::=  SEQUENCE  {
        extnID      OBJECT IDENTIFIER,
        critical    BOOLEAN DEFAULT FALSE,
        extnValue   OCTET STRING  }

通過描述可以看到Extensions是一個可選字段蒲肋,其內(nèi)部可以有最多MAX個拓展字段蘑拯,這里當(dāng)然無法單獨(dú)完成闡述,挑一些例子中的標(biāo)準(zhǔn)拓展字段描述兜粘。

Authority Key Identifier/Subject Key Identifier: 這兩個字段主要是在多證書的場景提供一種快速確定所需要公鑰的標(biāo)記申窘。Authority Key Identifier唯一標(biāo)記了該證書簽發(fā)私鑰對應(yīng)的公鑰,而Subject Key Identifier則是唯一標(biāo)記了當(dāng)前證書中的公鑰孔轴。舉個例子剃法,一個設(shè)備當(dāng)中可能有好多個證書,但是每一個app可能只需要對應(yīng)證書中的公鑰路鹰,那么就可以將這一串ID內(nèi)置在app中贷洲,證書也不需要完整解析,先去看看對應(yīng)Key Identifier字段是不是匹配即可晋柱。通常計算方式為計算公鑰的SHA1值优构,本例子中的Subject Key Identifier即為這種方式:

X509v3 Subject Key Identifier: 
   AF:32:A8:9D:20:98:F3:FD:14:41:FE:F4:C4:74:47:7C:D1:6C:81:B1

from hashlib import sha1
hash = sha1()
hash.update(b"\x04\xbc\x1c\xaa\x96\x6f\x6f\x99\x48\x79\x56\x61\x4b\x7f\xff\xdc\x39\x08\x3a\xd4\x4d\xe2\xd8\x87\x80\xaf\x3d\x18\x5e\x71\x2d\xce\x09\x70\x57\x39\x38\x5f\x2a\xee\xa8\x35\xf4\x3a\x86\x86\x5a\x1d\xc7\x31\x32\x1b\x8d\xac\xd0\x46\xad\xc3\xfc\xa5\xd3\x18\x36\x68\xab")
hash.hexdigest()

>>>'af32a89d2098f3fd1441fef4c474477cd16c81b1'

Key Usage/Extended Key Usage: 確定證書中公鑰的用途。以前一個為主雁竞,extended字段作為補(bǔ)充俩块。例子中的證書主要就是用來做TLS通訊中的數(shù)字簽名功能。Key Usage主要類型有以下幾種浓领,詳細(xì)描述可以參考標(biāo)準(zhǔn)中的描述玉凯,這里不展開說了:

      KeyUsage ::= BIT STRING {
           digitalSignature        (0),
           nonRepudiation          (1),
           keyEncipherment         (2),
           dataEncipherment        (3),
           keyAgreement            (4),
           keyCertSign             (5),
           cRLSign                 (6),
           encipherOnly            (7),
           decipherOnly            (8) }

Certificate Policies:以OID格式體現(xiàn),主要是表現(xiàn)申請證書時的緣由和預(yù)期的用途联贩。例子中的2.23.140.1.2.21.3.6.1.4.1.11129.2.5.3是典型的OID格式漫仆,每個點(diǎn)隔開一個屬性層級,可以通過 http://www.oid-info.com/ 進(jìn)行Object的查詢泪幌,如2.23.140.1.2.2表示為organization-validated盲厌,即

Certificates issued in accordance with the CA/Browser Forum's Baseline Requirements - Organization identity asserted

Authority Information Access:標(biāo)識了CA Issuer的信息,包括OCSP服務(wù)的網(wǎng)址與CA證書的下載地址祸泪。該部分在TLS很重要吗浩。OCSP服務(wù)會在后續(xù)CRL中提到。

CRL Distribution PointsCRL(Certificate Revocation List), 標(biāo)識了當(dāng)前CA吊銷列表文件的下載地址没隘,也是TLS握手階段重要的過程懂扼。后續(xù)將繼續(xù)分析。

CT Precertificate SCTs:證書透明度(Certificate Transparency); 這個是標(biāo)準(zhǔn)中沒有提到的一個比較新的拓展。CT主要搭配了CA服務(wù)器上公開的Log阀湿,將記錄CA的行為日志赶熟,而每一個與當(dāng)前證書相關(guān)的日志將被計入此字段,并被CA進(jìn)行簽名陷嘴。校驗(yàn)階段可以根據(jù)Log IDtimestamp查找日志中的對應(yīng)操作映砖,對證書進(jìn)行審計以確定當(dāng)前證書的合法性。該字段的提出主要就是防止CA被入侵者利用后獲取大量非法簽發(fā)證書灾挨,而透明性的日志保證了證書的簽發(fā)是到受到嚴(yán)格監(jiān)控的邑退。

CRL

證書的有效期似乎已經(jīng)能夠防止回退之內(nèi)的攻擊了,但是萬一在有效期內(nèi)發(fā)生了對應(yīng)私鑰的泄漏事件劳澄,該怎么取消掉證書的有效性呢瓜饥?這時候就需要crl出場了。

上面已經(jīng)提到了CRL Distribution Points浴骂,直接從對應(yīng)地址下載個crl

Certificate Revocation List (CRL):
        Version 2 (0x1)
        Signature Algorithm: sha256WithRSAEncryption
        Issuer: C = US, O = Google Trust Services, CN = GTS CA 1O1
        Last Update: Sep 19 02:13:00 2020 GMT
        Next Update: Sep 29 02:13:00 2020 GMT
        CRL extensions:
            X509v3 CRL Number: 
                1001
            X509v3 Authority Key Identifier: 
                keyid:98:D1:F8:6E:10:EB:CF:9B:EC:60:9F:18:90:1B:A0:EB:7D:09:FD:2B

Revoked Certificates:
    Serial Number: 049950FB5DD23C3502000000007A32AD
        Revocation Date: Sep 10 15:53:36 2020 GMT
        CRL entry extensions:
            X509v3 CRL Reason Code: 
                Affiliation Changed
    Serial Number: 05303980A9456025080000000056050B
        Revocation Date: Sep 10 15:53:42 2020 GMT
        CRL entry extensions:
            X509v3 CRL Reason Code: 
                Affiliation Changed
   ......
   Signature Algorithm: sha256WithRSAEncryption
         00:37:3c:7e:ba:71:d2:92:52:3a:f6:4d:86:c0:a2:c2:18:78:
         34:0e:ea:80:41:08:82:32:54:42:f0:2c:d7:f7:e0:81:93:dc:
         0d:e5:0b:71:1f:ae:7e:bf:1c:05:3c:3c:f8:2b:cb:99:20:21:
         80:29:a9:81:1d:f4:33:f4:21:95:70:f1:4c:38:30:34:28:32:
         be:0a:0b:0d:09:5d:81:33:72:fb:40:16:db:26:a1:7d:e9:11:
         56:74:11:58:e3:4d:37:93:23:68:6a:85:8c:89:05:7d:55:67:
         8c:da:3c:02:cb:46:3b:4e:7d:c6:38:12:02:cc:a8:ff:57:04:
         9d:0a:bf:07:30:36:5d:85:b7:4c:9e:a1:52:b8:2c:4a:ec:91:
         ba:ba:8f:74:60:f4:06:84:8b:d9:a7:08:3d:2a:cf:ee:66:c6:
         de:1e:ae:68:24:ed:0d:ca:d6:73:0e:40:b2:5c:91:00:dc:32:
         72:04:8b:46:65:12:9c:56:9d:aa:76:89:7b:c2:74:a8:b0:a3:
         de:e6:d6:d1:12:87:16:34:98:9b:2e:bd:38:ea:1c:59:03:40:
         0d:ba:0c:0c:f2:9e:31:64:33:1b:28:43:4e:3b:78:41:2e:d9:
         82:21:39:97:fe:c0:ab:9f:82:8d:18:02:26:c4:b0:44:c5:74:
         25:30:6a:50

    

還是先對應(yīng)ASN.1對于crl格式的描述看一下:

  CertificateList  ::=  SEQUENCE  {
        tbsCertList          TBSCertList,
        signatureAlgorithm   AlgorithmIdentifier,
        signatureValue       BIT STRING  }

   TBSCertList  ::=  SEQUENCE  {
        version                 Version OPTIONAL,
                                     -- if present, MUST be v2
        signature               AlgorithmIdentifier,
        issuer                  Name,
        thisUpdate              Time,
        nextUpdate              Time OPTIONAL,
        revokedCertificates     SEQUENCE OF SEQUENCE  {
             userCertificate         CertificateSerialNumber,
             revocationDate          Time,
             crlEntryExtensions      Extensions OPTIONAL
                                           -- if present, MUST be v2
                                  }  OPTIONAL,
        crlExtensions           [0]  EXPLICIT Extensions OPTIONAL
                                           -- if present, MUST be v2
                                  }

可以看到這時候crl的解析出來的格式順序已經(jīng)和標(biāo)準(zhǔn)的定義略有區(qū)別,但是不影響宪潮,只要知道所有的吊銷列表信息肯定都是被CA簽名了的溯警。

signatureAlgorithmsignatureValue 沒啥好說的,和之前證書和申請文件沒有區(qū)別狡相。

CertList

這一段可分為主要的兩個部分:吊銷文件信息和吊銷證書列表梯轻,這也是解析出來crl沒有按照順序排列的原因,為了打印的好看尽棕,這一段被拆分成了兩部分

先看吊銷文件信息:

version喳挑、signatureissuer 和之前完全一樣,不再贅述滔悉。

thisUpdate:指定了本次crl簽發(fā)的的時間伊诵。主要用來保證crl證書的時效性

nextUpdate:可選項(xiàng),指定了下一次crl簽發(fā)的時間

crlExtensions:包含了拓展信息回官,注意這個字段在實(shí)際的證書中是放在revokedCertificates后面的曹宴。在用例的google證書的crl中可以看到吊銷證書的數(shù)量(CRL Number: 1001)和Authority Key Identifier,可以看到這個Authority Key IdentifierX.509證書中的相同字段是一模一樣的。注意這個地方CRL Number是不一定等于revokedCertificates中被吊銷列表數(shù)量的歉提,其實(shí)為了加快查找效率笛坦,已經(jīng)過期的被吊銷證書是可以從列表中移除以減小列表的大小。

revokedCertificates

這是crl的核心部分苔巨,包含了被吊銷證書的唯一序列號(userCertificate CertificateSerialNumber)版扩,證書的吊銷時間(revocationDate),以及一些擴(kuò)展侄泽,用例中包含了典型用例:吊銷原因碼(CRL Reason Code)礁芦。

主要看一下唯一序列號這個段,這個段是剛好對應(yīng)X.509證書中的serialNumber段悼尾,這也是為什么這個段需要唯一的原因:他標(biāo)識了一張獨(dú)一無二的證書宴偿。

其實(shí)這時候查詢一個列表是否吊銷的流程已經(jīng)很簡單了:

  1. 握手階段獲取crl
  2. 通過CA證書校驗(yàn)crl簽名
  3. 查詢對端證書的序列號是否在revokedCertificates

但是這是唯一的方法嗎湘捎?如果碰到像當(dāng)年heartbleed一樣的大型泄漏事件,吊銷列表是不是特別大窄刘,特別大會造成兩個問題:下載慢窥妇、查詢慢,最終導(dǎo)致握手超時娩践。

第二點(diǎn)問題是crl有更新不及時的問題:CA機(jī)構(gòu)在吊銷一張證書后活翩,不會立刻去更新CRLs文件,客戶端定期緩存的CRLs文件也不是及時更新的翻伺,所以會導(dǎo)致一種情況是材泄,某張證書被吊銷后,由于CRLs文件沒有及時更新的緣故吨岭,身份校驗(yàn)通過了拉宗,認(rèn)為該張證書沒有問題。

所以為了解決對應(yīng)的問題辣辫,SSL中包含一種新協(xié)議

OCSP

OCSP(Online Certificate Status Protocol)旦事,即在線證書狀態(tài)協(xié)議。同樣是用來做服務(wù)器身份校驗(yàn)急灭,由CA機(jī)構(gòu)管理姐浮,使用數(shù)字簽名技術(shù)保護(hù),瀏覽器可以從中獲得證書的吊銷狀態(tài)和吊銷原因葬馋,方式是由身份校驗(yàn)方瀏覽器發(fā)送OCSP請求卖鲤,等待響應(yīng)來完成證書狀態(tài)獲取。當(dāng)然OCSP的格式同樣要遵照標(biāo)準(zhǔn)rfc6960畴嘶。這里就不細(xì)解析OCSP格式了蛋逾,可以參考標(biāo)準(zhǔn)文檔。
當(dāng)然OCSP最為協(xié)議當(dāng)然也有requestresponse(其實(shí)csr就是請求窗悯,申請下來的證書就是答復(fù))换怖,這里貼一下request的格式

   OCSPRequest     ::=     SEQUENCE {
       tbsRequest                  TBSRequest,
       optionalSignature   [0]     EXPLICIT Signature OPTIONAL }

   TBSRequest      ::=     SEQUENCE {
       version             [0]     EXPLICIT Version DEFAULT v1,
       requestorName       [1]     EXPLICIT GeneralName OPTIONAL,
       requestList                 SEQUENCE OF Request,
       requestExtensions   [2]     EXPLICIT Extensions OPTIONAL }
       
      Signature       ::=     SEQUENCE {
       signatureAlgorithm      AlgorithmIdentifier,
       signature               BIT STRING,
       certs               [0] EXPLICIT SEQUENCE OF Certificate
   OPTIONAL}

   Version         ::=             INTEGER  {  v1(0) }

   Request         ::=     SEQUENCE {
       reqCert                     CertID,
       singleRequestExtensions     [0] EXPLICIT Extensions OPTIONAL }

   CertID          ::=     SEQUENCE {
       hashAlgorithm       AlgorithmIdentifier,
       issuerNameHash      OCTET STRING, -- Hash of issuer's DN
       issuerKeyHash       OCTET STRING, -- Hash of issuer's public key
       serialNumber        CertificateSerialNumber }

尾聲

看起來X.509這一系列好像很簡單的樣子,然而這里打出來的其實(shí)都是完成解析之后的樣子蟀瞧,那么解析之前的DER格式的證書是啥樣子的呢:

00000000: 3082 04c8 3082 03b0 a003 0201 0202 1100  0...0...........
00000010: bc01 4105 22d8 cc7f 0200 0000 0079 647f  ..A."........yd.
00000020: 300d 0609 2a86 4886 f70d 0101 0b05 0030  0...*.H........0
00000030: 4231 0b30 0906 0355 0406 1302 5553 311e  B1.0...U....US1.
00000040: 301c 0603 5504 0a13 1547 6f6f 676c 6520  0...U....Google 
00000050: 5472 7573 7420 5365 7276 6963 6573 3113  Trust Services1.
00000060: 3011 0603 5504 0313 0a47 5453 2043 4120  0...U....GTS CA 
00000070: 314f 3130 1e17 0d32 3030 3832 3630 3831  1O10...200826081
00000080: 3432 335a 170d 3230 3131 3138 3038 3134  423Z..2011180814
00000090: 3233 5a30 6831 0b30 0906 0355 0406 1302  23Z0h1.0...U....
000000a0: 5553 3113 3011 0603 5504 0813 0a43 616c  US1.0...U....Cal
000000b0: 6966 6f72 6e69 6131 1630 1406 0355 0407  ifornia1.0...U..
000000c0: 130d 4d6f 756e 7461 696e 2056 6965 7731  ..Mountain View1
000000d0: 1330 1106 0355 040a 130a 476f 6f67 6c65  .0...U....Google
000000e0: 204c 4c43 3117 3015 0603 5504 0313 0e77   LLC1.0...U....w
000000f0: 7777 2e67 6f6f 676c 652e 636f 6d30 5930  ww.google.com0Y0
00000100: 1306 072a 8648 ce3d 0201 0608 2a86 48ce  ...*.H.=....*.H.
00000110: 3d03 0107 0342 0004 bc1c aa96 6f6f 9948  =....B......oo.H
00000120: 7956 614b 7fff dc39 083a d44d e2d8 8780  yVaK...9.:.M....
00000130: af3d 185e 712d ce09 7057 3938 5f2a eea8  .=.^q-..pW98_*..
00000140: 35f4 3a86 865a 1dc7 3132 1b8d acd0 46ad  5.:..Z..12....F.
00000150: c3fc a5d3 1836 68ab a382 025c 3082 0258  .....6h....\0..X
00000160: 300e 0603 551d 0f01 01ff 0404 0302 0780  0...U...........
00000170: 3013 0603 551d 2504 0c30 0a06 082b 0601  0...U.%..0...+..
...

啥啥啥沉颂,這是啥?悦污?

其實(shí)這就是反復(fù)提到的ASN.1格式铸屉。系列下一章就是手撕ASN.1, 做一個人肉decoder(想多了...)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市切端,隨后出現(xiàn)的幾起案子彻坛,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件昌屉,死亡現(xiàn)場離奇詭異钙蒙,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)间驮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進(jìn)店門躬厌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人竞帽,你說我怎么就攤上這事扛施。” “怎么了屹篓?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵疙渣,是天一觀的道長。 經(jīng)常有香客問我堆巧,道長妄荔,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任谍肤,我火速辦了婚禮啦租,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘谣沸。我一直安慰自己,他們只是感情好笋颤,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布乳附。 她就那樣靜靜地躺著,像睡著了一般伴澄。 火紅的嫁衣襯著肌膚如雪赋除。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天非凌,我揣著相機(jī)與錄音举农,去河邊找鬼。 笑死敞嗡,一個胖子當(dāng)著我的面吹牛颁糟,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播喉悴,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼棱貌,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了箕肃?” 一聲冷哼從身側(cè)響起婚脱,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后障贸,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體错森,經(jīng)...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年篮洁,在試婚紗的時候發(fā)現(xiàn)自己被綠了涩维。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,650評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡嘀粱,死狀恐怖激挪,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情锋叨,我是刑警寧澤垄分,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站娃磺,受9級特大地震影響薄湿,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜偷卧,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一豺瘤、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧听诸,春花似錦坐求、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至仔蝌,卻和暖如春泛领,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背敛惊。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工渊鞋, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人瞧挤。 一個月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓锡宋,卻偏偏與公主長得像,于是被迫代替她去往敵國和親特恬。 傳聞我的和親對象是個殘疾皇子员辩,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,527評論 2 349

推薦閱讀更多精彩內(nèi)容