引言
我們大多數人每天都使用加密通信,你可能不知道,甚至從每關心它。如你用百度搜索東西,你在阿里巴巴上買了一件喜歡的襯衫,HTTPS能防止你的數據在網絡傳輸過程中不被其他人竊取。
在本博客中,我們將介紹我們加密通信背后的知識,主要內容包括:為什么我們需要升級HTTP到HTTPS,HTTP的問題在哪里?TSL和SSL探討,HTTPS是什么?HTTPS是如何工作的?從黑客的角度如何攻擊HTTPS等。
在閱讀本文之前,作者默認了你已經對稱加密,非對稱加密,摘要算法已經有所了解,如果實在沒有基礎也沒關系,可以先讀讀這兩篇預熱下《【密碼學】一萬字帶您走進密碼學的世界(上)》,《【密碼學】一萬字帶您走進密碼學的世界(下)》
HTTP的問題在哪里?
如果你訪問一個網站默認了超文本傳輸協議(HTTP),其內容將明文傳輸。這意味着每個人在你和服務器之間的位置都可以看到你與網站的每個交互內容。當用HTTP傳輸私人信息(姓名,電子郵件,家庭住址,信用卡詳細信息等),黑客可以輕易的從網絡流量中截取你發送信息,因為這些都是明文傳輸,下圖使用fiddle2模擬的截取信息。
這種攻擊方式就叫中間人攻擊,當然因為這個衍生出來的還有緩存投毒,DDOS定向流向轉發等,這些不是本文重點,這個中間人存在你的客戶端和服務端的每個部分,例如,如果您連接到Wi-Fi熱點,則您和服務器之間通過HTTP傳輸的所有內容將對熱點中的每個參與者都可見。(是不是非常可怕,這也是不要輕易連接免費Wi-Fi的原因!!!)
用專業的術語總結一下HTTP的問題:
(1) 竊聽風險(eavesdropping):第三方可以獲知通信內容。
(2) 篡改風險(tampering):第三方可以修改通信內容。
(3) 冒充風險(pretending):第三方可以冒充他人身份參與通信。
技術進步的一個源動力是解決問題,這個時候一種加密技術應運而生那就是SSL。
SSL探討
SSL,英文全稱Secure Sockets Layer,為Netscape所研發,用以保障在Internet上數據傳輸的安全,利用數據加密(Encryption)的技術,可確保數據在網絡上的傳輸過程中不會被截取及竊聽。SSL協議位於TCP/IP協議與各種應用層協議之間,為數據通訊提供安全支持。下面我深入探討下SSL
寫到這里我毅然燃起了我對網景公司的情懷,其實網景公司不只發明了SSL,還發明了很多 Web 的基礎設施——比如“CSS 樣式表”和“JS 腳本”
TSL和SSL的區別
我們來看看SSL的發明歷史,你就明白區別啦
- 1994年,NetScape公司設計了SSL協議(Secure Sockets Layer)的1.0版,但是未發布。
- 1995年,NetScape公司發布SSL 2.0版,很快發現有嚴重漏洞。
- 1996年,SSL 3.0版問世,得到大規模應用。
- 1999年,互聯網標准化組織ISOC接替NetScape公司,發布了SSL的升級版TLS 1.0版。
- 2006年和2008年,TLS進行了兩次升級,分別為TLS 1.1版和TLS 1.2版。最新的變動是2011年TLS 1.2的修訂版。
很明顯TLS就是SSL的升級版,那么它都升級哪些東西
- 1 版本號:TLS記錄格式與SSL記錄格式相同,但版本號的值不同,TLS的版本1.0使用的版本號為SSLv3.1。
- 2 報文鑒別碼:SSLv3.0和TLS的MAC算法及MAC計算的范圍不同。TLS使用了RFC-2104定義的HMAC算法。SSLv3.0使用了相似的算法,兩者差別在於SSLv3.0中,填充字節與密鑰之間采用的是連接運算,而HMAC算法采用的是異或運算。但是兩者的安全程度是相同的。
- 3 偽隨機函數:TLS使用了稱為PRF的偽隨機函數來將密鑰擴展成數據塊,是更安全的方式。
- 4 報警代碼:TLS支持幾乎所有的SSLv3.0報警代碼,而且TLS還補充定義了很多報警代碼,如解密失敗(decryption_failed)、記錄溢出(record_overflow)、未知CA(unknown_ca)、拒絕訪問(access_denied)等。
- 5 密文族和客戶證書:SSLv3.0和TLS存在少量差別,即TLS不支持Fortezza密鑰交換、加密算法和客戶證書。
- 6 certificate_verify和finished消息:SSLv3.0和TLS在用certificate_verify和finished消息計算MD5和SHA-1散列碼時,計算的輸入有少許差別,但安全性相當。
- 7 加密計算:TLS與SSLv3.0在計算主密值(master secret)時采用的方式不同。
- 8 填充:用戶數據加密之前需要增加的填充字節。在SSL中,填充后的數據長度要達到密文塊長度的最小整數倍。而在TLS中,填充后的數據長度可以是密文塊長度的任意整數倍(但填充的最大長度為255字節),這種方式可以防止基於對報文長度進行分析的攻擊。
總而言之一句話:TLS比SSL更加標准化,更加安全
HTTPS探討
HTTPS 相當於是“HTTP over SSL”。舉個簡單的例子, SSL就像你家自來水管道外面的一個防護膜。
HTTPS是如何工作的
注意因為篇幅原因,此處所探討的只是HTTPS單向鑒別的實現。比方說,你要連接到taobao.com。您在瀏覽器中鍵入地址,按回車並在毫秒內轉到請求的網站。看起來很簡單,對吧?但是實際上后台經過的數次的轉發,我們在這里只討論HTTPS建立單向連接的那部分。
具體的步驟如下:
- 1.你的瀏覽器請服務器發送建立連接消息,消息中包含加密算法,是使用的協議等。
- 2.服務器對你的瀏覽器回應一個消息,消息中包含證書信息,然后你可以對證書的真偽進行驗證。
- 3.驗證通過之后,如果一切都按預期(即服務器已經成功驗證),瀏覽器開始發送交換(和同意)應該用於此會話的隨機密鑰。
- 4.服務器接收到到隨機秘鑰,然后開始進行數據交換。最終網頁的內容安全地傳輸並顯示在您的瀏覽器中。
可能你對上面的步驟依然存在疑惑,下面我們一起去解開它。首先證書是啥?其次證書如何校驗真偽,在步驟3中,客戶端像服務端發送的信息如何加密的?
電子證書是什么
假設你要和張三做生意,然后這個時候你不信任張三怎么辦,你敢不敢貿然把貨款打給他,答案肯定是否定的,這個找個信得過的中間人,有中間人開一份文件,有中間人李四的名義擔保張三的人品信譽沒問題,這個時候開的這個文件就叫證書(digital certificate)。
在上面的比喻中,你就是瀏覽器,張三就是服務器,中間人李四就是認證中心CA(Certificate Authority),上面說了CA必須是“信得過的,德高望重的”,並不是每家機構都夠資格頒發證書的。國內目前有34家CA搜索,下面列舉幾個
- 中國電信認證中心(CTCA)
- 海關認證中心(SCCA)
- 國家外貿部EDI中心建立的國富安CA安全認證中心
- 廣東電子商務認證中心(以后稱廣東CA)為首的“網證通”認證體系
- SHECA(上海CA)為首的UCA協卡認證體系。
如果你是服務商,首先你要像認證中心申請,然后認證中心給你頒發(當然了是收費的,而且還有期限),一旦頒發成功,你的瀏覽器展示就是這樣的
一些沒有經過證書的網站,或者需要自己預裝證書的網站
如何查看自己電腦上的證書?
1.windows 系統按 Win + R 鍵打開運行命令窗口,直接輸入 certmgr.msc,就可以看到了,如下圖所示:
2.也可以從瀏覽器中查看:工具->Internet選項->內容->證書
電子證書有哪些部分組成?
主體部分包括:
- 版本號:指出該證書使用了哪種版本的X.509標准(版本1、版本2或是版本3),版本號會影響證書中的一些特定信息,目前的版本為3
- 序列號: 標識證書的唯一整數,由證書頒發者分配的本證書的唯一標識符
- 簽名算法標識符: 用於簽證書的算法標識,由對象標識符加上相關的參數組成,用於說明本證書所用的數字簽名算法。例如,SHA-1和RSA的對象標識符就用來說明該數字簽名是利用RSA對SHA-1雜湊加密
- 認證機構的數字簽名:這是使用發布者私鑰生成的簽名,以確保這個證書在發放之后沒有被撰改過
- 認證機構: 證書頒發者的可識別名(DN),是簽發該證書的實體唯一的CA的X.500名字。使用該證書意味着信任簽發證書的實體。(注意:在某些情況下,比如根或頂級CA證書,發布者自己簽發證書)
- 有效期限: 證書起始日期和時間以及終止日期和時間;指明證書在這兩個時間內有效
- 主題信息:證書持有人唯一的標識符(或稱DN-distinguished name)這個名字在 Internet上應該是唯一的
- 公鑰信息: 包括證書持有人的公鑰、算法(指明密鑰屬於哪種密碼系統)的標識符和其他相關的密鑰參數
- 頒發者唯一標識符:標識符—證書頒發者的唯一標識符,僅在版本2和版本3中有要求,屬於可選項
擴展部分包括:
- 發行者密鑰標識符:證書所含密鑰的唯一標識符,用來區分同一證書擁有者的多對密鑰。
- 密鑰使用:一個比特串,指明(限定)證書的公鑰可以完成的功能或服務,如:證書簽名、數據加密等。如果某一證書將 KeyUsage 擴展標記為“極重要”,而且設置為“keyCertSign”,則在 SSL 通信期間該證書出現時將被拒絕,因為該證書擴展表示相關私鑰應只用於簽寫證書,而不應該用於 SSL。
- CRL分布點:指明CRL的分布地點
- 私鑰的使用期:指明證書中與公鑰相聯系的私鑰的使用期限,它也有Not Before和Not After組成。若此項不存在時,公私鑰的使用期是一樣的。
- 證書策略:由對象標識符和限定符組成,這些對象標識符說明證書的頒發和使用策略有關。
- 策略映射:表明兩個CA域之間的一個或多個策略對象標識符的等價關系,僅在CA證書里存在
- 主體別名:指出證書擁有者的別名,如電子郵件地址、IP地址等,別名是和DN綁定在一起的。
- 頒發者別名:指出證書頒發者的別名,如電子郵件地址、IP地址等,但頒發者的DN必須出現在證書的頒發者字段。
- 主體目錄屬性:指出證書擁有者的一系列屬性。可以使用這一項來傳遞訪問控制信息。
例如我伯大的證書:
證書的信任鏈
最后的補充說明
1.瀏覽器對服務器的認證取決於兩點:1,瀏覽器對中間人CA的信任(信任傳遞),2,服務器自身采用公私鑰加密協議並對外公布公鑰。
2.為什么建立連接之后開始使用隨機對稱秘鑰加密?因為對稱秘鑰快!
3.為什么HTTPS的普及率不夠高?1.因為HTTPS相比HTTP慢!2.因為CA的證書收費!
總結
本文主要闡述了HTTPS的工作原理,介紹了證書的相關概念,在后續的文章中,我會以實際的項目環境配置(如nginx如何配置HTTPS,Tomcat如何配置HTTPS等)來進行分析。
聲明
本文35%為翻譯組合,65%為原創
引用
https://www.emerchantpay.com/blog/articles/what-is-https-and-why-should-i-use-encryption
http://www.baike.com/wiki/SSL
http://www.ruanyifeng.com/blog/2014/02/ssl_tls.html
http://blog.csdn.net/adrian169/article/details/9164385