資源描述:
《中對證書鏈的驗(yàn)證》由會員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在學(xué)術(shù)論文-天天文庫。
1、iOS中對HTTPS證書鏈的驗(yàn)證這篇文章是我一邊學(xué)習(xí)證書驗(yàn)證一邊記錄的內(nèi)容,稍微整理了下,共扯了三部分內(nèi)容:1.HTTPS簡要原理;2.數(shù)字證書的內(nèi)容、生成及驗(yàn)證;3.iOS上對證書鏈的驗(yàn)證。HTTPS概要HTTPS是運(yùn)行在TLS/SSL之上的HTTP,與普通的HTTP相比,在數(shù)據(jù)傳輸?shù)陌踩陨嫌泻艽蟮奶嵘?。要了解它安全性的巧妙之處,需要先簡單地了解對稱加密和非對稱加密的區(qū)別:·對稱加密只有一個密鑰,加密和解密都用這個密鑰;·非對稱加密有公鑰和私鑰,私鑰加密后的內(nèi)容只有公鑰才能解密,公鑰加密的內(nèi)容只有私鑰才能解密。為了提高安全性,我們常用的做法是使用對稱加密的手段加密數(shù)據(jù)??墒?/p>
2、只使用對稱加密的話,雙方通信的開始總會以明文的方式傳輸密鑰。那么從一開始這個密鑰就泄露了,談不上什么安全。所以TLS/SSL在握手的階段,結(jié)合非對稱加密的手段,保證只有通信雙方才知道對稱加密的密鑰。大概的流程如下:TSL:SSL_handshake.png所以,HTTPS實(shí)現(xiàn)傳輸安全的關(guān)鍵是:在TLS/SSL握手階段保證僅有通信雙方得到SessionKey!數(shù)字證書的內(nèi)容X.509應(yīng)該是比較流行的SSL數(shù)字證書標(biāo)準(zhǔn),包含(但不限于)以下的字段:字段值說明對象名稱(SubjectName)用于識別該數(shù)字證書的信息共有名稱(CommonName)對于客戶證書,通常是相應(yīng)的域名證書頒
3、發(fā)者(IssuerName)發(fā)布并簽署該證書的實(shí)體的信息簽名算法(SignatureAlgorithm)簽名所使用的算法序列號(SerialNumber)數(shù)字證書機(jī)構(gòu)(CertificateAuthority,CA)給證書的唯一整數(shù),一個數(shù)字證書一個序列號生效期(NotValidBefore)(`?ω?′)失效期(NotValidAfter)(╯°口°)╯(┴—┴公鑰(PublicKey)可公開的密鑰簽名(Signature)通過簽名算法計(jì)算證書內(nèi)容后得到的數(shù)據(jù),用于驗(yàn)證證書是否被篡改除了上述所列的字段,還有很多拓展字段,在此不一一詳述。下圖為Wikipedia的公鑰證書:wi
4、kipedia_cer.png數(shù)字證書的生成及驗(yàn)證數(shù)字證書的生成是分層級的,下一級的證書需要其上一級證書的私鑰簽名。所以后者是前者的證書頒發(fā)者,也就是說上一級證書的SubjectName是其下一級證書的IssuerName。在得到證書申請者的一些必要信息(對象名稱,公鑰私鑰)之后,證書頒發(fā)者通過SHA-256哈希得到證書內(nèi)容的摘要,再用自己的私鑰給這份摘要加密,得到數(shù)字簽名。綜合已有的信息,生成分別包含公鑰和私鑰的兩個證書。扯到這里,就有幾個問題:問:如果說發(fā)布一個數(shù)字證書必須要有上一級證書的私鑰加密,那么最頂端的證書——根證書怎么來的?根證書是自簽名的,即用自己的私鑰簽名,不
5、需要其他證書的私鑰來生成簽名。問:怎么驗(yàn)證證書是有沒被篡改?當(dāng)客戶端走HTTPS訪問站點(diǎn)時,服務(wù)器會返回整個證書鏈。以下圖的證書鏈為例:chain_hierarchy.png要驗(yàn)證?*.wikipedia.org?這個證書有沒被篡改,就要用到?GlobalSignOrganizationValidationCA-SHA256-G2?提供的公鑰解密前者的簽名得到摘要Digest1,我們的客戶端也計(jì)算前者證書的內(nèi)容得到摘要Digest2。對比這兩個摘要就能知道前者是否被篡改。后者同理,使用?GlobalSignRootCA?提供的公鑰驗(yàn)證。當(dāng)驗(yàn)證到到受信任的根證書時,就能確定?*.
6、wikipedia.org?這個證書是可信的。問:為什么上面那個根證書?GlobalSignRootCA?是受信任的?數(shù)字證書認(rèn)證機(jī)構(gòu)(CertificateAuthority,CA)簽署和管理的?CA根證書,會被納入到你的瀏覽器和操作系統(tǒng)的可信證書列表中,并由這個列表判斷根證書是否可信。所以不要隨便導(dǎo)入奇奇怪怪的根證書到你的操作系統(tǒng)中。問:生成的數(shù)字證書(如?*.wikipedia.org)都可用來簽署新的證書嗎?不一定。如下圖,拓展字段里面有個叫BasicConstraints的數(shù)據(jù)結(jié)構(gòu),里面有個字段叫路徑長度約束(PathLengthConstraint),表明了該證書能
7、繼續(xù)簽署CA子證書的深度,這里為0,說明這個?GlobalSignOrganizationValidationCA-SHA256-G2?只能簽署客戶端證書,而客戶端證書不能用于簽署新的證書,CA子證書才能這么做。path_length_constraint.pngiOS上對證書鏈的驗(yàn)證在?OverridingTLSChainValidationCorrectly?中提到:WhenaTLScertificateisverified,theoperatingsystemverifiesitsch