做者:王繼波 野狗科技運維總監,曾在360、TP-Link從事網絡運維相關工做,在網站性能優化、網絡協議研究上經驗豐富。
野狗官博:https://blog.wilddog.com/
野狗官網:https://www.wilddog.com/
公衆訂閱號:wilddogbaashtml
當你訪問一個網站時,有沒有想過這個問題:如何保證個人訪問能直達目標網站,而沒有被中間人攻擊和劫持。想要解決這個問題,就得依靠HTTPS中的身份認證機制。算法
HTTPS的基本概念,我在前面的文章介紹過,能夠理解爲HTTP+TLS。TLS協議是HTTPS的關鍵,其設計目標是構建安全的傳輸層,主要經過數據加密、身份認證、數據完整性來實現,同時還具有高擴展性、兼容性的特色。瀏覽器
本文將介紹HTTPS功能中的身份認證,及其工做機制。安全
X.509是PKI體系中的一個證書標準,PKI體系將在後面的文章中再介紹。RFC文檔中有對X.509的詳細描述[RFC文檔] ( https://tools.ietf.org/html/rfc5280#section-4.1.1.2 ) 。當前野狗官網( https://www.wilddog.com ) 使用的證書格式正是X.509v3。性能優化
X.509v3證書由三部分組成:微信
tbsCertificate (to be signed certificate),待簽名證書網絡
SignatureAlgorithm,簽名算法運維
SignatureValue,簽名值函數
tbsCertificate又包含10項內容,在HTTPS握手過程當中以明文方式傳輸:性能
Version Number,版本號
Serial Number,序列號
Signature Algorithm ID,簽名算法ID
Issuer Name,發行者
Validity period,有效時間
Subject name ,證書主體名稱
Subject Public Key Info ,證書主體公鑰信息,包含公鑰算法和公鑰值
Issuer Unique Identifier (optional),發行商惟一ID
Subject Unique Identifier (optional),主體惟一ID
Extensions (optional),擴展
SignatureAlgorithm是指定對tbsCertificate簽名使用的算法。SignatureValue是使用SignatureAlgorithm指定的哈希和簽名算法對tbsCertificate進行哈希和簽名後的簽名值。
可使用Wireshark抓包查看這些字段信息,結果以下:
若是以爲wireshark操做太複雜,也能夠在瀏覽器上點擊導航欄https小圖標查看。
咱們以某用戶訪問野狗官網爲例,分析身份認證的過程(如下過程並不是完整HTTPS握手過程,只是身份認證相關的過程)。
瀏覽器向Server發送請求;
Server返回野狗官網的X.509v3證書,其包含三部分:tbsCertificate、SignatureAlgorithm、SignatureValue;
瀏覽器讀取證書中的tbsCertificate部分(明文),使用SignatureAlgorithm中的散列函數計算獲得信息摘要,並利用tbsCertificate中的公鑰解密SignatureValue獲得信息摘要,而後對比雙方的信息摘要,判斷是否一致;若是一致,則成功;若是不一致,則失敗。
雖然野狗官網的認證完成,但整個身份認證過程並無結束,由於還須要認證證書鏈,這在文章後面將介紹。
身份認證算法有多種,最多見的是RSA。經過openssl命令能夠查看到:
openssl ciphers –V | column –t
我截取了部分輸出結果,其中加密套件是認證、加密、MAC、密鑰交換、密鑰衍生的組合,如 ECDHE-RSA-AES256-GCM-SHA384,ECDHE作密鑰交換、RSA作身份認證、AES256-GCM作加密算法、SHA384作摘要。
更直接的說:私鑰加密、公鑰解密,如何保證整個過程的安全。引用維基百科對RSA的描述:對極大整數作因素分解難度決定了RSA算法的可靠性。換言之,對一極大整數作因數分解愈困難,RSA算法愈可靠。咱們來看下RSA的過程:
隨機選擇兩個大的質數p和q,p不等於q,計算N=pq;
根據歐拉函數,求得r=φ(N) = φ(p)φ(q)=(p-1)(q-1);
選擇一個小於r的整數e,使e與r互質。並求得e關於r的模反元素d,ed ≡ 1 (mod r);
將p和q的記錄銷燬。
最後獲得:(N,e)是公鑰,(N,d)是私鑰。
使用公鑰(N,e)加密明文m,獲得密文c
me ≡ c (mod N)
使用私鑰(N,d)解密密文c,獲得明文m
cd ≡ m (mod N)
真正安全的保證是N不能被分解獲得q和p。實際通訊中,N一般很是大,好比2的2048次方,這在目前是不能被破解的。
在生成證書時,能夠指定RSA的密鑰長度;證書使用後,在證書信息中也能夠查看。
實際上,在HTTPS通訊中,Server下發給Client的不單單是對端網站的證書,而是一個證書鏈。這個證書鏈是從網站證書開始,逐級往上,到根證書。每一個證書都被下個證書的私鑰簽署,每一個證書的 Issuer 就是下個證書的 Subject,root CA內置在瀏覽器中,是被瀏覽器所信任的。
那麼爲何會使用證書鏈?使用證書鏈的好處有兩個:1.安全,2.保持CA的私鑰離線,方便部署和撤銷。若是沒有證書鏈,那麼當由CA來驗證網站的證書時,如何保障這個過程當中的CA是可靠的而不是僞造的。這就是證書鏈的做用。證書鏈的頂端是內置在瀏覽器或操做系統中的rootCA,一級一級的信任,保證了最後網站身份的可靠認證。每一個證書的證書鏈每每是多條的,野狗官網證書的證書鏈有兩條。
咱們以野狗官網證書的三級證書鏈爲例,wilddog.com證書 –> Go Daddy Secure Certificate Authority證書 –> Go Daddy Root Certificate Authority證書 。瀏覽器在接收到wilddog.com網站的證書鏈後,首先會對wilddog.com網站證書認證:
驗證完wilddog.com證書後,向上驗證中間證書GoDaddy Secure證書,過程與之相似;驗證完GoDaddy Secure證書後,繼續驗證GoDaddy Root證書,由於GoDaddy Root證書是自簽名的,是瀏覽器內置的CA證書,因此是被瀏覽器所信任的。
這就是證書的信任鏈,瀏覽器信任內置CA證書–Go Daddy Root證書,Go Daddy Root證書信任Go Daddy Secure證書,Go Daddy Secure證書信任wilddog.com證書,因此瀏覽器信任wilddog.com證書。
固然每一個瀏覽器內置的CA列表存在差別,Mozilla的CA證書列表:
http://mxr.mozilla.org/mozilla-release/source/security/nss/lib/ckfw/builtins/certdata.txt
Go Daddy Root證書在Chrome瀏覽器內置的CA列表中看到。
關注微信公衆號,及時獲取技術乾貨