從事移動互聯網軟件開發的小夥伴確定瞭解:自Android 9.0開始,應用程序的網絡請求默認使用https;基本是同期蘋果IOS在應用網絡請求方面,也強制使用https禁止http。 這一期間若是你去面試,不瞭解Https的握手過程,都很差意思講工資。 本人一個普通程序員,項目期間工期緊張,並未抽出時間詳細瞭解Https網絡請求過程當中TLS握手過程,所以這件事一直在個人待辦記錄中... 這篇文章以Wireshark抓包,詳細瞭解Https請求中TLS的握手過程 與 客戶端證書校驗過程。html
HTTPS
(Secure Hypertext Transfer Protocol)安全超文本傳輸協議,是一種經過計算機網絡進行安全通訊的傳輸協議。 HTTPS 利用 SSL/TLS 來加密數據包,經由 HTTP 進行通訊。
其設計的主要目的是,提供對網站服務器的身份認證、保護交換數據的隱私與完整性。java
TLS/SSLgit
SSL(Secure Socket Layer)
1994年由 瀏覽器開發商Netscape公司 率先倡導研發,爲數據通信提供安全支持,開發了最初的幾個版本SSL 1.0、SSL 2.0、SSL 3.0。TLS(Transport LayerSecurity)
前身爲SSL,1999年從 3.1 開始被 IETF(Internet Engineering Task Force,Internet 工程任務組)標準化並更名,發展至今已經有 TLS 1.0、TLS 1.一、TLS 1.2 三個版本。 SSL3.0和TLS1.0因爲存在安全漏洞,已經不多被使用到; TLS 1.3 改動會比較大,目前還在草案階段,目前使用最普遍的是TLS 1.一、TLS 1.2;TLS/SSL
是介於TCP和HTTP之間的一層安全協議。程序員
Http面試
HTTP(HyperText Transfer Protocol)
超文本傳輸協議。 HTTP
是一個客戶端(用戶)和服務端之間請求和應答的標準,其最初的設計目的是爲了提供一種發佈和接收HTML頁面的方法。算法
Http
協議不是本文重點,感興趣的同窗可參考文章: HTTP 協議詳解 blog.csdn.net/xiaxl/artic…瀏覽器
SSL/TLS握手過程用一句話總結就是:用非對稱加密的手段傳遞密鑰,而後用密鑰進行對稱加密傳遞數據
。 如下爲SSL/TLS握手過程的時序圖:安全
這裏以客戶端
向百度主頁
發起Https
請求爲例,用Wireshark抓包對SSL/TLS握手的各個環節進行介紹,Wireshark抓包示意圖以下圖所示:bash
握手第一步是客戶端向服務端發送 Client Hello 消息,消息中包含客戶端的 TSL版本信息、祕鑰隨機數、加密套件候選列表、壓縮算法候選列表、擴展字段
等信息,相關信息經過Wireshark抓包以下:服務器
服務端向客戶端發送 Server Hello 消息:包括服務端選擇使用的TSL協議版本、選擇的加密套件、選擇的壓縮算法、服務端生成的隨機數
等,相關信息經過Wireshark抓包以下:
到此客戶端和服務端都擁有了兩個隨機數(random_C+ random_S)
,這兩個隨機數會在後續生成對稱祕鑰時用到。
服務端下發服務端的公鑰證書
給客戶端,相關信息經過Wireshark抓包以下:
該消息的目的是攜帶密鑰交換的額外數據
,該消息內容對於不一樣的協商算法套件會存在差別:
通知客戶端
,服務端
已經將全部預計的握手消息發送完畢。
客戶端拿到服務端
的公鑰證書
後,需對該證書的合法性進行校驗,校驗內容以下:
注: 證書的詳細校驗過程將在下文進行詳細介紹
Pre-master
,計算生成祕鑰enc_key
(enc_key=Fuc(random_C, random_S, Pre-Master)
,將Pre-master
與enc_key
用證書公鑰加密(非對稱加密算法)
發送給服務端;協商的通訊密鑰
和加密算法
進行加密通訊;全部的握手數據(包括接受、發送)
生成摘要,而後用協商好的祕鑰enc_key加密(對稱加密算法)
,發送給對應的服務端; 服務端收到消息後,會用祕鑰enc_key
解密客戶端的摘要信息
,而後用與客戶端相同的算法生成服務端摘要信息
,最後對比兩個摘要信息相同,則驗證經過;服務器一樣發送 Change Cipher Spec Protocol 以告知客戶端後續的通訊都採用協商的密鑰與算法進行加密通訊;
服務端也會將握手過程的消息生成摘要再用祕鑰加密,這是服務端發出的第一條加密消息; 客戶端接收後會用祕鑰解密,能解出來講明協商的祕鑰是一致的。
到這裏,雙方已安全地協商出了同一份祕鑰enc_key
,全部的應用層數據都會用這個祕鑰加密後再經過 TCP 進行可靠傳輸。
SSL/TLS握手過程:用非對稱加密的手段傳遞密鑰,而後用密鑰進行對稱加密傳遞數據
。
客戶端驗證服務端下發的證書,主要包括如下幾個方面:
受信任的CA根證書頒發機構
頒發;受信任的CA根證書頒發機構
頒發爲了確保客戶端
獲取到的服務端公鑰
不被篡改,需引入權威的第三方CA機構。 CA機構負責覈實公鑰擁有者信息
、頒發「證書(對服務端公鑰進行簽名)
」,同時爲使用者提供證書驗證服務
。
CA機構頒發證書的基本原理爲:
服務端公鑰
、服務端私鑰
;服務端公鑰
提供給CA機構;服務端公鑰
擁有者信息(覈實申請者提供信息的真實性,如組織是否存在、企業是否合法、是否擁有域名的全部權等);服務端公鑰的摘要信息
,利用CA機構的私鑰
(CA機構有一對公鑰、私鑰)進行加密,加密後的服務端公鑰即CA機構頒發的「證書」
;客戶端驗證服務端公鑰的基本原理爲:
服務端的公鑰
;CA機構的公鑰
,對 服務端公鑰
進行解密,獲取到服務端公鑰的摘要信息A
;CA機構可以簽發證書,一樣也存在機制宣佈以往簽發的證書無效。使用者私鑰丟失,使用者申請讓證書無效等狀況,CA機構須要廢棄該證書。 主要存在兩類機制:CRL 與 OCSP。
CRL Distribution Point
,通知使用者去哪裏下載對應的 CRL 以校驗證書是否吊銷。 該吊銷方式的優勢是不須要頻繁更新,可是不能及時吊銷證書,由於 CRL 更新時間通常是幾天,這期間可能已經形成了極大損失。校驗證書的有效期是否已通過期
校驗證書域名是否一致:覈查證書域名是否與當前的訪問域名匹配
。 這裏覈驗的是咱們請求的域名 www.baidu.com 是否與證書文件中DNS標籤下所列的域名
相匹配;
注: 具體的證書文件舉例,請查看第四節 「4、證書舉例」 。
一種錯誤的寫法:
Android 軟件開發中,咱們常常會遇到如下代碼,用來忽略證書的域名驗證,其實這是一種不安全的寫法:
// 對於自簽名證書,用如下代碼來忽略證書的域名驗證
HostnameVerifier hostnameVerifier = new HostnameVerifier() {
@Override
public boolean verify(String urlHostName, SSLSession session) {
// 忽略證書的域名驗證
return true;
}
};
複製代碼
這裏以百度的Https證書舉例:
Certificate:
Data:
Version: 3 (0x2)
Serial Number:
72:58:78:36:6e:9f:56:e8:1d:41:88:48
Signature Algorithm: sha256WithRSAEncryption
Issuer: C=BE, O=GlobalSign nv-sa, CN=GlobalSign Organization Validation CA - SHA256 - G2
Validity
Not Before: Apr 2 07:04:58 2020 GMT
Not After : Jul 26 05:31:02 2021 GMT
Subject: C=CN, ST=beijing, L=beijing, OU=service operation department, O=Beijing Baidu Netcom Science Technology Co., Ltd, CN=baidu.com
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (2048 bit)
Modulus:
00:c1:a9:b0:ae:47:1a:d2:57:eb:1d:15:1f:6e:5c:
b2:e4:f8:0b:20:db:ea:00:df:29:ff:a4:6b:89:26:
4b:9f:23:2f:ec:57:b0:8a:b8:46:40:2a:7e:bc:dc:
5a:45:97:4f:ad:41:0e:bc:20:86:4b:0c:5d:55:21:
47:e2:31:3c:57:a7:ec:99:47:eb:47:0d:72:d7:c8:
16:54:75:ef:d3:45:11:0f:4b:ce:60:7a:46:5c:28:
74:ae:8e:1b:be:d8:70:66:7b:a8:93:49:28:d2:a3:
76:94:55:de:7c:27:f2:0f:f7:98:0c:ad:86:da:c6:
ae:fd:9f:f0:d9:81:32:9a:97:e3:21:ee:04:92:96:
e4:78:11:e5:c4:10:0e:10:31:7a:4a:97:a0:eb:c7:
9b:c4:da:89:37:a9:c3:37:d7:56:b1:7f:52:c7:d9:
26:0a:d6:af:38:16:b1:6d:fb:73:79:b1:68:79:03:
90:eb:88:7b:8c:48:91:98:51:a5:07:94:86:a5:78:
46:79:8f:58:9b:e9:35:59:a7:f1:7b:57:31:0a:90:
cf:24:ce:0d:24:e7:92:b2:6a:e9:e6:96:37:0a:b8:
7c:87:2f:74:d2:5c:e8:4b:0a:5f:66:18:a7:41:86:
cf:26:a6:08:8e:a5:49:17:92:53:b3:91:a5:cf:53:
b0:31
Exponent: 65537 (0x10001)
X509v3 extensions:
X509v3 Key Usage: critical
Digital Signature, Key Encipherment
Authority Information Access:
CA Issuers - URI:http://secure.globalsign.com/cacert/gsorganizationvalsha2g2r1.crt
OCSP - URI:http://ocsp2.globalsign.com/gsorganizationvalsha2g2
X509v3 Certificate Policies:
Policy: 1.3.6.1.4.1.4146.1.20
CPS: https://www.globalsign.com/repository/
Policy: 2.23.140.1.2.2
X509v3 Basic Constraints:
CA:FALSE
X509v3 CRL Distribution Points:
Full Name:
URI:http://crl.globalsign.com/gs/gsorganizationvalsha2g2.crl
X509v3 Subject Alternative Name:
DNS:baidu.com, DNS:baifubao.com, DNS:www.baidu.cn, DNS:www.baidu.com.cn, DNS:mct.y.nuomi.com, DNS:apollo.auto, DNS:dwz.cn, DNS:*.baidu.com, DNS:*.baifubao.com, DNS:*.baidustatic.com, DNS:*.bdstatic.com, DNS:*.bdimg.com, DNS:*.hao123.com, DNS:*.nuomi.com, DNS:*.chuanke.com, DNS:*.trustgo.com, DNS:*.bce.baidu.com, DNS:*.eyun.baidu.com, DNS:*.map.baidu.com, DNS:*.mbd.baidu.com, DNS:*.fanyi.baidu.com, DNS:*.baidubce.com, DNS:*.mipcdn.com, DNS:*.news.baidu.com, DNS:*.baidupcs.com, DNS:*.aipage.com, DNS:*.aipage.cn, DNS:*.bcehost.com, DNS:*.safe.baidu.com, DNS:*.im.baidu.com, DNS:*.baiducontent.com, DNS:*.dlnel.com, DNS:*.dlnel.org, DNS:*.dueros.baidu.com, DNS:*.su.baidu.com, DNS:*.91.com, DNS:*.hao123.baidu.com, DNS:*.apollo.auto, DNS:*.xueshu.baidu.com, DNS:*.bj.baidubce.com, DNS:*.gz.baidubce.com, DNS:*.smartapps.cn, DNS:*.bdtjrcv.com, DNS:*.hao222.com, DNS:*.haokan.com, DNS:*.pae.baidu.com, DNS:*.vd.bdstatic.com, DNS:click.hm.baidu.com, DNS:log.hm.baidu.com, DNS:cm.pos.baidu.com, DNS:wn.pos.baidu.com, DNS:update.pan.baidu.com
X509v3 Extended Key Usage:
TLS Web Server Authentication, TLS Web Client Authentication
X509v3 Authority Key Identifier:
keyid:96:DE:61:F1:BD:1C:16:29:53:1C:C0:CC:7D:3B:83:00:40:E6:1A:7C
X509v3 Subject Key Identifier:
......
複製代碼
TSL: tools.ietf.org/html/rfc524…
SSL/TSL 原理: www.cnblogs.com/chenjingqua…
TLS/SSL握手過程 blog.csdn.net/hherima/art…