在實(shí)際工作中,涉及到X.509證書(shū)結(jié)構(gòu)與 TLS證書(shū)校驗(yàn)鏈的場(chǎng)景便是 HTTPS 網(wǎng)絡(luò)請(qǐng)求。
這篇文章從HTTPS網(wǎng)絡(luò)請(qǐng)求開(kāi)始,詳細(xì)介紹HTTPS秘鑰協(xié)商的詳細(xì)流程、TLS證書(shū)的校驗(yàn)流程、TLS證書(shū)鏈的校驗(yàn)流程。
- HTTPS
HTTPS簡(jiǎn)介。 - TLS握手
HTTPS秘鑰協(xié)商流程詳細(xì)說(shuō)明。 - TLS證書(shū) 校驗(yàn)
- TLS證書(shū)鏈 校驗(yàn)
一、HTTPS簡(jiǎn)介
HTTPS (Secure Hypertext Transfer Protocol)安全超文本傳輸協(xié)議,是一種通過(guò)計(jì)算機(jī)網(wǎng)絡(luò)進(jìn)行安全通信的傳輸協(xié)議。
HTTPS 利用 SSL/TLS 來(lái)加密數(shù)據(jù)包,經(jīng)由 HTTP 進(jìn)行通信。
其設(shè)計(jì)的主要目的是,提供對(duì)網(wǎng)站服務(wù)器的身份認(rèn)證、保護(hù)交換數(shù)據(jù)的隱私與完整性。

TLS/SSL
TLS 與 SSL某種程度上指的是同一個(gè)概念:
-
SSL(Secure Socket Layer) 1994年由 瀏覽器開(kāi)發(fā)商Netscape(美國(guó)網(wǎng)景通信公司) 率先倡導(dǎo)研發(fā),為數(shù)據(jù)通訊提供安全支持,開(kāi)發(fā)了最初的幾個(gè)版本SSL 1.0、SSL 2.0、SSL 3.0。 -
TLS(Transport LayerSecurity)前身為SSL,1999年從 3.1 開(kāi)始被IETF(Internet Engineering Task Force,Internet 工程任務(wù)組)標(biāo)準(zhǔn)化并改名,發(fā)展至今已經(jīng)有 TLS 1.0、TLS 1.1、TLS 1.2 三個(gè)版本。
SSL3.0、TLS1.0由于存在安全漏洞,已經(jīng)很少被使用到。TLS 1.3 因改動(dòng)會(huì)比較大,目前尚處在草案階段。當(dāng)前被廣泛使用的是是TLS 1.1、TLS 1.2;

如上圖所示,TLS/SSL是介于TCP和HTTP之間的一層安全協(xié)議。
HTTP
HTTP(HyperText Transfer Protocol)超文本傳輸協(xié)議。
HTTP是一個(gè)客戶端(用戶)和服務(wù)端之間請(qǐng)求和應(yīng)答的標(biāo)準(zhǔn),其最初的設(shè)計(jì)目的是為了提供一種發(fā)布和接收HTML頁(yè)面的方法。
二、SSL/TLS 握手
SSL/TLS握手過(guò)程 用一句話總結(jié)就是:用非對(duì)稱加密的手段傳遞密鑰,然后用密鑰進(jìn)行對(duì)稱加密傳遞數(shù)據(jù)。
SSL/TLS握手,秘鑰協(xié)商的過(guò)程大致可分為以下幾個(gè)步驟:
- 1、Client Hello
Client——>Server 客戶端向服務(wù)端發(fā)送 Client Hello 消息。 - 2、Server Hello
Server——>Client 服務(wù)端向客戶端發(fā)送 Server Hello 消息。 - 3、Certificate
Server——>Client 服務(wù)端下發(fā)公鑰證書(shū)。 - 4、Server Key Exchange
Server——>Client 服務(wù)端下發(fā)秘鑰交換的額外數(shù)據(jù)。 - 5、Server Hello Done
Server——>Client 服務(wù)端握手信息發(fā)送完畢。 - 6、證書(shū)合法性校驗(yàn)
Client 對(duì) Server下發(fā)的公鑰證書(shū)進(jìn)行合法性校驗(yàn)。 - 7、協(xié)商加密秘鑰
Client——>Server 協(xié)商計(jì)算客戶端、服務(wù)端通信的加密秘鑰enc_key。 - 8、Change Cipher Spec Protocol
Server——>Client 服務(wù)端告知客戶端后續(xù)的通信都采用協(xié)商的秘鑰enc_key與算法進(jìn)行加密通信。 - 9、Encrypted Handshake Message
Server——>Client 服務(wù)端用秘鑰enc_key加密,發(fā)出的第一條加密消息。 - 10、Application Data
Client——>Server SSL/TLS 握手完成,所有后續(xù)通信均 采用秘鑰enc_key加密。
SSL/TLS握手,秘鑰協(xié)商的流程圖 如下圖所示:

這里以客戶端向百度主頁(yè)發(fā)起Https請(qǐng)求為例,用 Wireshark抓包 對(duì)SSL/TLS握手的各個(gè)環(huán)節(jié)進(jìn)行介紹,抓包示意圖如下圖所示:

2.1、Client Hello
Client Hello( Client——>Server ): 客戶端向服務(wù)端發(fā)送 Client Hello 消息。
消息中包含客戶端的 TSL版本信息、秘鑰隨機(jī)數(shù)、加密套件候選列表、壓縮算法候選列表、擴(kuò)展字段等信息,相關(guān)信息抓包如下:

各字段詳細(xì)描述如下:
- Version : 支持的最高TSL協(xié)議版本,從低到高依次 SSLv2 SSLv3 TLSv1 TLSv1.1 TLSv1.2;
- Random:隨機(jī)數(shù)
random_C用于后續(xù)的密鑰協(xié)商; - Session ID:有或者無(wú),有則客戶端傳上一次session的id可以恢復(fù)session;
- Cipher Suite:客戶端支持的密碼算法列表,供服務(wù)器選擇;
- Compression Methods:客戶端支持的壓縮算法列表,用于后續(xù)的信息壓縮傳輸;
- extensions:擴(kuò)展字段;
2.2、Server Hello
Server Hello( Server——>Client ): 服務(wù)端向客戶端發(fā)送 Server Hello 消息。
消息中包括服務(wù)端選擇使用的TSL協(xié)議版本、選擇的加密套件、選擇的壓縮算法、服務(wù)端生成的隨機(jī)數(shù)等,相關(guān)信息抓包如下:
[圖片上傳失敗...(image-54a50e-1678667179308)]
- Version:服務(wù)器選擇的版本;
- Random:隨機(jī)數(shù)
random_S用于后續(xù)的密鑰協(xié)商; - Session ID:有或者無(wú),有則客戶端傳上一次session的id可以恢復(fù)session;
- Cipher Suite:服務(wù)端選擇的密鑰算法;
- Compression Methods:服務(wù)端選擇的壓縮算法;
注:到此 客戶端 和 服務(wù)端 都擁有了兩個(gè)隨機(jī)數(shù)(random_C+ random_S),這兩個(gè)隨機(jī)數(shù)會(huì)在后續(xù)生成對(duì)稱秘鑰時(shí)會(huì)用到。
2.3、Certificate
Certificate( Server——>Client ): 服務(wù)端下發(fā)公鑰證書(shū)給客戶端。相關(guān)信息抓包如下:

-
Certificate:服務(wù)端的公鑰證書(shū);
注:Certificate 公鑰證書(shū)的詳細(xì)結(jié)構(gòu)會(huì)在下文進(jìn)行詳細(xì)舉例說(shuō)明。
2.4、Server Key Exchange
Server Key Exchange( Server——>Client ): 該消息的目的是 攜帶密鑰交換的額外數(shù)據(jù)。

該消息內(nèi)容對(duì)于不同的協(xié)商算法套件會(huì)存在差異:
- 對(duì)于使用DHE/ECDHE非對(duì)稱密鑰協(xié)商算法的SSL握手,服務(wù)器發(fā)送其使用的DH參數(shù);
- RSA算法不會(huì)繼續(xù)該握手流程(DH、ECDH也不會(huì)發(fā)送server key exchange)。
2.5、Server Hello Done
Server Hello Done( Server——>Client ):
通知客戶端,Server端已經(jīng)將所有握手消息發(fā)送完畢。

2.6、證書(shū)校驗(yàn)
客戶端拿到服務(wù)端的公鑰證書(shū)后,需對(duì)該證書(shū)的合法性進(jìn)行校驗(yàn)。校驗(yàn)內(nèi)容如下:
- 證書(shū)鏈的可信性;
- 證書(shū)是否吊銷;
- 證書(shū)有效期;
- 證書(shū)域名校驗(yàn),核查證書(shū)域名是否與當(dāng)前的訪問(wèn)域名匹配;
注:證書(shū)的詳細(xì)校驗(yàn)過(guò)程將在下文進(jìn)行詳細(xì)介紹
2.7、協(xié)商加密秘鑰
Client——>Server: 這一步包含三個(gè)步驟,主要是 協(xié)商計(jì)算客戶端、服務(wù)端通信的加密秘鑰。

- Client Key Exchange
證書(shū)合法性驗(yàn)證通過(guò)之后,客戶端產(chǎn)生隨機(jī)數(shù)字Pre-master。
計(jì)算生成秘鑰enc_key{ enc_key=Fuc(random_C, random_S, Pre-Master) } 。
將Pre-master與enc_key用證書(shū)公鑰加密(非對(duì)稱加密算法)發(fā)送給服務(wù)端; - Change Cipher Spec Protocol
客戶端通知服務(wù)端后續(xù)的通信都采用協(xié)商的密鑰enc_key和加密算法進(jìn)行加密通信; - Encrypted Handshake Message
客戶端:客戶端將之前所有的握手?jǐn)?shù)據(jù)(包括接受、發(fā)送)生成摘要;然后用秘鑰enc_key加密(對(duì)稱加密算法),發(fā)送給對(duì)應(yīng)的服務(wù)端。
服務(wù)端:服務(wù)端收到消息后,會(huì)用秘鑰enc_key解密客戶端的摘要信息;然后用與客戶端相同的算法生成服務(wù)端摘要信息,最后對(duì)比兩個(gè)摘要信息相同,則驗(yàn)證通過(guò)。
2.8、Change Cipher Spec Protocol
Change Cipher Spec Protocol( Server——>Client ): 服務(wù)器同樣發(fā)送 Change Cipher Spec Protocol 以告知客戶端后續(xù)的通信都采用協(xié)商的秘鑰enc_key與算法進(jìn)行加密通信;

2.9、Encrypted Handshake Message
Encrypted Handshake Message( Server——>Client ):
服務(wù)端:服務(wù)端會(huì)將握手過(guò)程的消息生成摘要再用秘鑰enc_key加密,這是服務(wù)端發(fā)出的第一條加密消息;
客戶端:客戶端接收后會(huì)用秘鑰enc_key解密,能解出來(lái)說(shuō)明協(xié)商的秘鑰是一致的。

2.10、Application Data ( Client——>Server )
Application Data Client——>Server ): 雙方已安全地協(xié)商出了同一份秘鑰enc_key,所有的應(yīng)用層數(shù)據(jù)都會(huì)用這個(gè)秘鑰加密后再通過(guò) TCP 進(jìn)行可靠傳輸。

SANs證書(shū)
SANs是Subject Alternate Names的簡(jiǎn)稱,SANs證書(shū)是一種SSL證書(shū),它支持添加多個(gè)域名,允許將多個(gè)域名寫入同一個(gè)證書(shū)中,這樣就可以保護(hù)多個(gè)域名,從而降低了運(yùn)維人員的管理成本,提高了證書(shū)管理效率。SAN證書(shū)有時(shí)也稱為統(tǒng)一通信證書(shū)(統(tǒng)一通信證書(shū))、多域名證書(shū)等。

沃通CA出售的SSL證書(shū)大都支持SANs特性:
1,一張證書(shū)最多可保護(hù) 250-1000 個(gè)域名;
2,可同時(shí)使用的服務(wù)器數(shù)不限,不另付費(fèi)用;
3,可以支持增加、刪除或修改域名等功能。
4,部分 SANs 證書(shū)還支持將公網(wǎng) IP 地址作為 SAN 直接添加到證書(shū)中。
通過(guò)http 的 header host 來(lái)進(jìn)行判斷
2.11 總結(jié)
SSL/TLS握手協(xié)商:用非對(duì)稱加密的手段傳遞密鑰,然后用密鑰進(jìn)行對(duì)稱加密傳遞數(shù)據(jù)。
三、證書(shū)校驗(yàn)
- 1、X.509數(shù)字證書(shū)結(jié)構(gòu)舉例
- 2、客戶端 如何校驗(yàn)服務(wù)端下發(fā)的公鑰證書(shū)?
3.1、X.509數(shù)字證書(shū)
了解證書(shū)校驗(yàn)原理之前,先認(rèn)識(shí)一下X.509證書(shū)的結(jié)構(gòu)。
X.509是密碼學(xué)里公鑰證書(shū)的格式標(biāo)準(zhǔn),當(dāng)前X.509證書(shū)已應(yīng)用在包括TLS/SSL在內(nèi)的眾多網(wǎng)絡(luò)協(xié)議里。
一個(gè)具體的X.509 v3數(shù)字證書(shū)結(jié)構(gòu)大致如下 :
// X.509數(shù)字證書(shū)Certificate // 版本號(hào) Version Number // 序列號(hào) Serial Number // 證書(shū)簽名算法ID Signature Algorithm ID // 證書(shū)發(fā)行者 Issuer Name // 證書(shū)有效時(shí)間 Validity period // 證書(shū)主體名稱 Subject name // 證書(shū)主體公鑰信息 Subject Public Key Info // 證書(shū)公鑰算法 Public Key Algorithm // 證書(shū)公鑰 Subject Public Key // 發(fā)行商唯一ID Issuer Unique Identifier (optional) // 主體唯一ID Subject Unique Identifier (optional) // 擴(kuò)展 Extensions (optional) // 證書(shū)簽名算法Certificate Signature Algorithm// 證書(shū)簽名值Certificate Signature
這里以百度的Tls證書(shū)進(jìn)行舉例:


3.2、證書(shū)校驗(yàn)
客戶端驗(yàn)證服務(wù)端下發(fā)的證書(shū),主要包括以下幾個(gè)方面:
- 1、校驗(yàn)證書(shū)是否是
受信任的CA根證書(shū)頒發(fā)機(jī)構(gòu)頒發(fā); - 2、校驗(yàn)證書(shū)是否在上級(jí)證書(shū)的
吊銷列表; - 3、校驗(yàn)證書(shū)
是否過(guò)期; - 4、校驗(yàn)證書(shū)
域名是否一致。
3.2.1、證書(shū)可信性
校驗(yàn)證書(shū)是否可信:
校驗(yàn)證書(shū)是否是由受信任的CA根證書(shū)頒發(fā)機(jī)構(gòu)頒發(fā)。
為了確保客戶端獲取到的服務(wù)端公鑰不被篡改,需引入權(quán)威的第三方CA機(jī)構(gòu)。
CA機(jī)構(gòu)負(fù)責(zé)核實(shí)公鑰擁有者信息、頒發(fā)證書(shū)(對(duì)服務(wù)端公鑰進(jìn)行簽名)、同時(shí)為使用者提供證書(shū)驗(yàn)證服務(wù)。

CA機(jī)構(gòu) 頒發(fā)證書(shū)的基本原理:
-
服務(wù)端生成一對(duì)公鑰、私鑰。 -
服務(wù)端將自己的公鑰提供給CA機(jī)構(gòu)。 -
CA機(jī)構(gòu)核實(shí)服務(wù)端公鑰擁有者信息:
核實(shí)申請(qǐng)者提供信息的真實(shí)性:如組織是否存在、企業(yè)是否合法、是否擁有域名的所有權(quán)等。 -
CA機(jī)構(gòu)簽發(fā)證書(shū):
CA機(jī)構(gòu) 計(jì)算 服務(wù)器公鑰摘要信息,然后利用CA機(jī)構(gòu)私鑰(CA機(jī)構(gòu)有一對(duì)公鑰、私鑰)加密摘要信息。
加密后的包含加密摘要信息的服務(wù)端公鑰即CA機(jī)構(gòu)頒發(fā)的證書(shū)。
客戶端 驗(yàn)證服務(wù)端公鑰的基本原理為:
-
客戶端獲取到服務(wù)端的公鑰:
Https請(qǐng)求 TLS握手過(guò)程中,服務(wù)器公鑰會(huì)下發(fā)到請(qǐng)求的客戶端。 -
客戶端用存儲(chǔ)在本地的CA機(jī)構(gòu)的公鑰,對(duì)服務(wù)端公鑰中對(duì)應(yīng)的摘要信息進(jìn)行解密,獲取到服務(wù)端公鑰的摘要信息A; -
客戶端根據(jù)對(duì)服務(wù)端公鑰進(jìn)行摘要計(jì)算,得到摘要信息B; -
對(duì)比摘要信息A與B,相同則證書(shū)驗(yàn)證通過(guò);
3.2.2、證書(shū)吊銷
CA機(jī)構(gòu)能夠簽發(fā)證書(shū),同樣也存在機(jī)制宣布以往簽發(fā)的證書(shū)無(wú)效。若證書(shū)的申請(qǐng)主體出現(xiàn):私鑰丟失、申請(qǐng)證書(shū)無(wú)效等情況,CA機(jī)構(gòu)需要廢棄該證書(shū)。
主要存在兩類機(jī)制:CRL 與 OCSP。
- CRL(Certificate Revocation List)
證書(shū)吊銷列表:是一個(gè)單獨(dú)的文件,該文件包含了 CA機(jī)構(gòu) 已經(jīng)吊銷的證書(shū)序列號(hào)與吊銷日期;
證書(shū)中一般會(huì)包含一個(gè) URL 地址CRL Distribution Point,通知使用者去哪里下載對(duì)應(yīng)的 CRL 以校驗(yàn)證書(shū)是否吊銷。
該吊銷方式的優(yōu)點(diǎn)是不需要頻繁更新,但是不能及時(shí)吊銷證書(shū),因?yàn)?CRL 更新時(shí)間一般是幾天,這期間可能已經(jīng)造成了極大損失。 - OCSP(Online Certificate Status Protocol)
證書(shū)狀態(tài)在線查詢協(xié)議:一個(gè)實(shí)時(shí)查詢證書(shū)是否吊銷的方式。
請(qǐng)求者發(fā)送證書(shū)的信息并請(qǐng)求查詢,服務(wù)器返回正常、吊銷或未知中的任何一個(gè)狀態(tài)。
證書(shū)中一般也會(huì)包含一個(gè) OCSP 的 URL 地址,要求查詢服務(wù)器具有良好的性能。
部分 CA 或大部分的自簽 CA (根證書(shū))都是未提供 CRL 或 OCSP 地址的,對(duì)于吊銷證書(shū)會(huì)是一件非常麻煩的事情。
3.2.3、證書(shū)過(guò)期
校驗(yàn)證書(shū)的有效期是否已經(jīng)過(guò)期:主要判斷證書(shū)中Validity period字段是否過(guò)期。
3.2.4、證書(shū)域名
校驗(yàn)證書(shū)域名是否一致:核查 證書(shū)域名是否與當(dāng)前的訪問(wèn)域名 匹配。
舉例中:
我們請(qǐng)求的域名 www.baidu.com 是否與證書(shū)文件中DNS標(biāo)簽下所列的域名相匹配;
四、證書(shū)鏈校驗(yàn)
上一節(jié)介紹證書(shū)校驗(yàn)場(chǎng)景,適用于服務(wù)器證書(shū)的簽發(fā)機(jī)構(gòu)就是Ca機(jī)構(gòu)。
實(shí)際證書(shū)申請(qǐng)中,由于權(quán)威的CA機(jī)構(gòu)數(shù)量不多,若所有的服務(wù)器證書(shū)都向權(quán)威CA機(jī)構(gòu)申請(qǐng),那么CA機(jī)構(gòu)的工作量就會(huì)非常大。因此CA機(jī)構(gòu)采取授權(quán) 二級(jí)機(jī)構(gòu)的方式來(lái)管理證書(shū)申請(qǐng),經(jīng)授權(quán)的二級(jí)機(jī)構(gòu)也可以簽發(fā)服務(wù)器證書(shū)。

4.1、證書(shū)鏈校驗(yàn)
證書(shū)簽發(fā):
-
根證書(shū)CA機(jī)構(gòu) 使用自己的私鑰對(duì)中間證書(shū)進(jìn)行簽名,授權(quán)中間機(jī)構(gòu)證書(shū); -
中間機(jī)構(gòu)使用自己的私鑰對(duì)服務(wù)器證書(shū)進(jìn)行簽名,從而授權(quán)服務(wù)器證書(shū)。
證書(shū)校驗(yàn):
-
客戶端通過(guò)服務(wù)器證書(shū)中簽發(fā)機(jī)構(gòu)信息,獲取到中間證書(shū)公鑰;利用中間證書(shū)公鑰進(jìn)行服務(wù)器證書(shū)的簽名驗(yàn)證。
a、中間證書(shū)公鑰解密 服務(wù)器簽名,得到證書(shū)摘要信息;
b、摘要算法計(jì)算 服務(wù)器證書(shū) 摘要信息;
c、然后對(duì)比兩個(gè)摘要信息。 -
客戶端通過(guò)中間證書(shū)中簽發(fā)機(jī)構(gòu)信息,客戶端本地查找到根證書(shū)公鑰;利用根證書(shū)公鑰進(jìn)行中間證書(shū)的簽名驗(yàn)證。

4.2、中間證書(shū)怎么獲???
這里可能大家有一個(gè)疑問(wèn),根證書(shū)是內(nèi)置在終端設(shè)備上或?yàn)g覽器中的,那中間機(jī)構(gòu)證書(shū)怎么獲?。?/p>
這里仍以百度的Tls證書(shū)進(jìn)行舉例,百度服務(wù)器證書(shū) 簽發(fā)者公鑰(中間機(jī)構(gòu)公鑰)通過(guò)下圖中的URI獲?。?/p>
