前言
在說HTTPS之前先說說什么是HTTP,HTTP就是我們平時瀏覽網頁時候使用的一種協議。HTTP協議傳輸的數據都是未加密的,也就是明文的,因此使用HTTP協議傳輸隱私信息非常不安全。為了保證這些隱私數據能加密傳輸,于是網景公司設計了SSL(Secure Sockets Layer)協議用于對HTTP協議傳輸的數據進行加密,從而就誕生了HTTPS。SSL目前的版本是3.0,被IETF(Internet Engineering Task Force)定義在RFC 6101中,之后IETF對SSL 3.0進行了升級,于是出現了TLS(Transport Layer Security) 1.0,定義在RFC 2246。實際上我們現在的HTTPS都是用的TLS協議,但是由于SSL出現的時間比較早,并且依舊被現在瀏覽器所支持,因此SSL依然是HTTPS的代名詞,但無論是TLS還是SSL都是上個世紀的事情,SSL最后一個版本是3.0,今后TLS將會繼承SSL優良血統繼續為我們進行加密服務。目前TLS的版本是1.2,定義在RFC 5246中,暫時還沒有被廣泛的使用。
HTTPS和HTTP的區別
超文本傳輸協議HTTP協議被用于在Web瀏覽器和網站服務器之間傳遞信息。HTTP協議以明文方式發送內容,不提供任何方式的數據加密,如果攻擊者截取了Web瀏覽器和網站服務器之間的傳輸報文,就可以直接讀懂其中的信息,因此HTTP協議不適合傳輸一些敏感信息,比如信用卡號、密碼等。
為了解決HTTP協議的這一缺陷,需要使用另一種協議:安全套接字層超文本傳輸協議HTTPS。為了數據傳輸的安全,HTTPS在HTTP的基礎上加入了SSL協議,SSL依靠證書來驗證服務器的身份,并為瀏覽器和服務器之間的通信加密。
HTTPS和HTTP的區別主要為以下四點:
一、https協議需要到ca申請證書,一般免費證書很少,需要交費。
二、http是超文本傳輸協議,信息是明文傳輸,https 則是具有安全性的ssl加密傳輸協議。
三、http和https使用的是完全不同的連接方式,用的端口也不一樣,前者是80,后者是443。
四、http的連接很簡單,是無狀態的;HTTPS協議是由SSL+HTTP協議構建的可進行加密傳輸、身份認證的網絡協議,比http協議安全。
HTTPS原理
Https在真正請求數據前,先會與服務有幾次握手驗證,在握手過程中將確立雙方加密傳輸數據的密碼信息,以證明相互的身份,以下圖為例:
單向認證
上圖的握手過程的簡單描述如下:
1.瀏覽器將自己支持的一套加密規則發送給網站。
2.網站從中選出一組加密算法與HASH算法,并將自己的身份信息以證書的形式發回給瀏覽器。證書里面包含了網站地址,加密公鑰,以及證書的頒發機構等信息。
3.獲得網站證書之后瀏覽器要做以下工作:
a) 驗證證書的合法性(頒發證書的機構是否合法,證書中包含的網站地址是否與正在訪問的地址一致等),如果證書受信任,則瀏覽器欄里面會顯示一個小鎖頭,否則會給出證書不受信的提示。
b) 如果證書受信任,或者是用戶接受了不受信的證書,瀏覽器會生成一串隨機數的密碼,并用證書中提供的公鑰加密。
c) 使用約定好的HASH計算握手消息,并使用生成的隨機數對消息進行加密,最后將之前生成的所有信息發送給網站。
4.網站接收瀏覽器發來的數據之后要做以下的操作:
a) 使用自己的私鑰將信息解密取出密碼,使用密碼解密瀏覽器發來的握手消息,并驗證HASH是否與瀏覽器發來的一致。
b) 使用密碼加密一段握手消息,發送給瀏覽器。
5.瀏覽器解密并計算握手消息的HASH,如果與服務端發來的HASH一致,此時握手過程結束,之后所有的通信數據將由之前瀏覽器生成的隨機密碼并利用對稱加密算法進行加密。
這里瀏覽器與網站互相發送加密的握手消息并驗證,目的是為了保證雙方都獲得了一致的密碼,并且可以正常的加密解密數據,為后續真正數據的傳輸做一次測試。另外,HTTPS一般使用的加密與HASH算法如下:
非對稱加密算法:RSA,DSA/DSS
對稱加密算法:AES,RC4,3DES
HASH算法:MD5,SHA1,SHA256
其中非對稱加密算法用于在握手過程中加密生成的密碼,對稱加密算法用于對真正傳輸的數據進行加密,而HASH算法用于驗證數據的完整性。由于瀏覽器生成的密碼是整個數據加密的關鍵,因此在傳輸的時候使用了非對稱加密算法對其加密。非對稱加密算法會生成公鑰和私鑰,公鑰只能用于加密數據,因此可以隨意傳輸,而網站的私鑰用于對數據進行解密,所以網站都會非常小心的保管自己的私鑰,防止泄漏。
雙向認證
一般web應用都是采用單向認證的,原因很簡單,用戶數目廣泛,且無需做在通訊層做用戶身份驗證,一般都在應用邏輯層來保證用戶的合法登入。但如果是企業應用對接,情況就不一樣,可能會要求對client(相對而言)做身份驗證。這時需要做雙向認證。(需要在服務器上配置認證)。一般https加密都是采用的單向認證。
TLS握手過程中如果有任何錯誤,都會使加密連接斷開,從而阻止了隱私信息的傳輸。正是由于HTTPS非常的安全,攻擊者無法從中找到下手的地方,于是更多的是采用了假證書的手法來欺騙客戶端,從而獲取明文的信息,但是這些手段都可以被識別出來,我將在后續的文章進行講述。不過2010年還是有安全專家發現了TLS 1.0協議處理的一個漏洞:http://www.theregister.co.uk/2011/09/19/beast_exploits_paypal_ssl/,實際上這種稱為BEAST的攻擊方式早在2002年就已經被安全專家發現,只是沒有公開而已。目前微軟和Google已經對此漏洞進行了修復。見:http://support.microsoft.com/kb/2643584/en-us https://src.chromium.org/viewvc/chrome?view=rev&revision=90643
SSL證書
從上面我們了解到HTTPS核心的一個部分是數據傳輸之前的握手,握手過程中確定了數據加密的密碼。在握手過程中,網站會向瀏覽器發送SSL證書,SSL證書和我們日常用的身份證類似,是一個支持HTTPS網站的身份證明,SSL證書里面包含了網站的域名,證書有效期,證書的頒發機構以及用于加密傳輸密碼的公鑰等信息,由于公鑰加密的密碼只能被在申請證書時生成的私鑰解密,因此瀏覽器在生成密碼之前需要先核對當前訪問的域名與證書上綁定的域名是否一致,同時還要對證書的頒發機構進行驗證,如果驗證失敗瀏覽器會給出證書錯誤的提示。那么在SSL證書的驗證過程以及個人用戶在訪問HTTPS網站時,對SSL證書的使用需要注意哪些安全方面呢?
一、證書的類型
實際上,我們使用的證書分很多種類型,SSL證書只是其中的一種。證書的格式是由X.509標準定義。SSL證書負責傳輸公鑰,是一種PKI(Public Key Infrastructure,公鑰基礎結構)證書。
我們常見的證書根據用途不同大致有以下幾種:
1、SSL證書,用于加密HTTP協議,也就是HTTPS。
2、代碼簽名證書,用于簽名二進制文件,比如Windows內核驅動,Firefox插件,Java代碼簽名等等。
3、客戶端證書,用于加密郵件。
4、雙因素證書,網銀專業版使用的USB Key里面用的就是這種類型的證書。
這些證書都是由受認證的證書頒發機構——我們稱之為CA(Certificate Authority)機構來頒發,針對企業與個人的不同,可申請的證書的類型也不同,價格也不同。CA機構頒發的證書都是受信任的證書,對于SSL證書來說,如果訪問的網站與證書綁定的網站一致就可以通過瀏覽器的驗證而不會提示錯誤。
二、SSL證書申請與規則
SSL證書可以向CA機構通過付費的方式申請,也可以自己制作。
CA機構頒發的證書價格非常昂貴,而且有效期一般只有一年到三年不等(年數不同,價格也不同),過期之后還要再次交錢申請,因此一般只有企業才會申請證書。但是隨著個人網站的增多,目前也有針對個人的SSL證書服務,價格相對便宜一些,國內的話400多塊錢就能申請到一個,國外更是有免費的SSL證書可以申請。
在申請SSL證書時需要向CA機構提供網站域名,營業執照,以及申請人的身份信息等。網站的域名非常重要,申請人必須證明自己對域名有所有權,如果支持Hotmail.com,Gmail.com的SSL證書都可以隨便申請,黑客們就不用做假證書欺騙了。此外,一個證書一般只綁定一個域名,如果CA機構心情好的話,會免費再綁一個,比如你要申請域名時綁定的域名是guokr.com,那么只有在瀏覽器地址是https://guokr.com的時候,這個證書才是受信任的,如果地址是https://www.guokr.com或者https://login.guokr.com,那么這個證書由于訪問的域名與證書綁定的域名不同,仍然會被瀏覽器顯示為不受信任的。CA機構也提供申請通配符域名(例如,*.guokr.com),通配符域名相當于綁定了主域名下的所有域名,因此使用起來非常方便,但是價格也超級昂貴,一個通配符域名一年大概得5000塊錢,只有企業才可以申請。
下面就來看看一個證書的信息:
在訪問hotmail的時候會跳轉到login.live.com,這時IE瀏覽器上會有一個小鎖頭,點一下那個小鎖頭再點擊里面的“查看證書”就會出現上圖的證書窗口,這里面我們可以看到這個證書只有一個用途——向遠程計算機證明身份信息,證書的用途會有很多,SSL只是其中之一。在“頒發給”這一項就是這個證書在申請時綁定的域名;下面的“頒發者”是證書的頒發機構。最下面的兩個日期是證書申請時間以及過期的時間。這里我們可以注意一下“頒發者”的信息,里面有“Extended Validation SSL”的字樣,表明了這個證書是一個EV SSL證書(擴展驗證SSL證書),EV SSL證書有個特點就是可以讓瀏覽器的地址欄變綠,同時顯示出來證書所屬公司的名稱,如下圖所示:
EV SSL證書與其他的證書相比,費用更高。
以上說的是向CA機構申請證書的情況,如果個人網站只為加密傳輸也可以自己制作SSL證書,自己制作的證書不會受到瀏覽器的信任,在訪問的時候由于證書驗證失敗而給出警告。
三、證書的驗證過程
證書以證書鏈的形式組織,在頒發證書的時候首先要有根CA機構頒發的根證書,再由根CA機構頒發一個中級CA機構的證書,最后由中級CA機構頒發具體的SSL證書。我們可以這樣理解,根CA機構就是一個公司,根證書就是他的身份憑證,每個公司由不同的部門來頒發不同用途的證書,這些不同的部門就是中級CA機構,這些中級CA機構使用中級證書作為自己的身份憑證,其中有一個部門是專門頒發SSL證書,當把根證書,中級證書,以及最后申請的SSL證書連在一起就形成了證書鏈,也稱為證書路徑。在驗證證書的時候,瀏覽器會調用系統的證書管理器接口對證書路徑中的所有證書一級一級的進行驗證,只有路徑中所有的證書都是受信的,整個驗證的結果才是受信。我們還是以login.live.com這個證書舉例,在查看證書的時候,點擊“證書路徑”標簽就會有下圖的顯示:
根證書是最關鍵的一個證書,如果根證書不受信任,它下面頒發的所有證書都不受信任。操作系統在安裝過程中會默認安裝一些受信任的CA機構的根證書,可以在“運行”里面運行“certmgr.msc”啟動證書管理器,如下圖所示:
根證書的有效期長,支持的用途多以方便頒發不同用途類型的中級證書;中級證書用途單一,有效期相對短一些,但是比具體的SSL證書要長很多。
如果SSL證書驗證失敗根據瀏覽器的不同會有以下的錯誤提示:
SSL證書驗證失敗有以下三點原因:
1、SSL證書不是由受信任的CA機構頒發的
2、證書過期
3、訪問的網站域名與證書綁定的域名不一致
這三點原因也是IE瀏覽器給出的提示。
小提示:如果你對哪個根證書CA機構比較憎恨,可以將它的根證書刪除,這樣所有它頒發的證書都不會受信任。
四、SSL證書的安全問題
對HTTPS最常見的攻擊手段就是SSL證書欺騙或者叫SSL劫持,是一種典型的中間人攻擊。不過SSL劫持并非只是用于攻擊目的,在一些特殊情況下利用SSL劫持我們可以更順暢的訪問網絡,我會在后文提到。
以攻擊為目的的SSL劫持如果不注意瀏覽器安全提示的話,很容易就中招。當網絡中有中間人發起SSL劫持攻擊時,攻擊者需要偽造一個SSL證書發給瀏覽器,這個時候由于偽造的SSL證書不受信任,瀏覽器會給出提示。
這里有一個誤區,當SSL證書不受信任的時候,并不一定就是有SSL劫持發生,有種例外情況是:一些個人網站買不起合法的SSL證書,因此會自己制作一個SSL證書來加密傳輸的數據。如果你經常訪問某個個人網站,而且你知道這個網站是干什么的,那么這種情況可以不用擔心。但是如果你訪問的是網銀,在線支付,或者是hotmail.com,gmail.com等,這類公司性質的網站一定會申請合法的SSL證書(12306.cn除外),一旦SSL證書不受信任,應該果斷的終止訪問,這個時候網絡中一定會存在異常行為,對于一些小區寬帶的用戶一定要注意這點。
所以作為個人用戶,你一定要知道你訪問的是什么網站,如果你只是一個沒有多少計算機只是的普通網民,我相信你不會經常上那些自己制作SSL證書的個人網站(12306.cn除外),因此如果你沒有辦法判斷網絡是不是有異常,只要是證書有問題的,干脆就別再訪問了。
小提示:對于12306.cn,一定要按照網站說的那樣,“為保障您順暢購票,請下載安裝根證書”。
使用SSL證書要注意的那些事:
1、除非必要,不要隨意安裝根證書。安裝根證書的時候一定要明確證書的來源。
2、對于網銀,在線支付,重要郵箱等網站,一定要確保SSL證書是沒有問題的,如果瀏覽器給出SSL證書錯誤的警告,一定要拒絕訪問。一些小區寬帶用戶一定要注意這點。
3、由于現在個人申請SSL證書比較便宜,一定要注意掛著合法SSL證書的釣魚網站(國外比較常見)。對于釣魚網站,一定要看清域名,另外別相信什么中獎的消息,同時要安裝帶有釣魚防護功能的安全軟件。
手機如何抓取HTTPS的請求數據
當站點由HTTP轉成HTTPS后是更安全了,但是有時候要看線上的請求數據解決問題時卻麻煩了,因為是HTTPS的請求,你就算攔截到了那也是加密的數據,沒有任何意義。那有方法解決嗎? 答案是肯定的! 接下來就來個實例教程,教大家如何查看HTTPS的請求數據。我是使用 Charles 獲取 https 的數據,其他的抓包工具像Fiddler等都類似。
1. 配置 Charles 根證書
首先打開 Charles:
然后如下圖操作:
之后會彈出鑰匙串,如果不彈出,請自行打開鑰匙串,如下圖:
系統默認是不信任 Charles 的證書的,此時對證書右鍵,在彈出的下拉菜單中選擇『顯示簡介』,點擊使用此證書時,把使用系統默認改為始終信任,如下圖:
然后關閉,就會發現 charles 的證書已經被信任了,如下圖:
2. 在移動設備上配置證書
如下圖,選擇在移動設備上安裝 Charles 根證書:
會彈出一個提示框,如下圖
進入手機設置界面:
然后打開手機的瀏覽器,輸入 ?charlesproxy.com/getssl?
會彈出如下界面:
點擊安裝即可,如果出現的不是這個界面,那么把鏈接換成
https://www.charlesproxy.com/documentation/additional/legacy-ssl-proxying/,點擊安裝 itself 后面的 here 就可以了。
這里以簡書為例...??,
此時還是獲取不到 https 的數據,各位童鞋不要著急,下面還有操作,接著還是進入 Charles ,如下圖操作:
如下圖,勾選Enable SSL Proxying,點擊添加,彈出下面的對話框,Host 表示你要抓取的 ip 地址或是鏈接,Port 填寫 443 即可:
設置完成后,就可以抓取數據啦,如下圖:
搞定!
為什么安裝了Charles根證書可以看到Https請求內容?
要解釋這個問題,就需要了解最開始的Https的驗證原理了,回顧一下,先是客戶端把自己支持的加密方式提交到服務端,然后服務端 會返回一個證書,到這一步問題來了,手機未什么要安裝Fiddler的證書呢?
第一 因為Fiddler在客戶端(手機)發出Https請求時,充當了服務器的角色,需要返回一個證書給客戶端,
但是Fiddler的證書并不是CA機構頒發的,客戶端一驗證就知道是假的連接肯定就斷了,那怎么辦呢?
那就想辦法讓客戶端信任這個服務端,于是就在客戶端安裝一個Fiddler的根證書。
所以只要是通過Fiddler的Https請求,驗證根證書時自然會通過,因為Fiddler的根證書你已經受信了!
第二 現在只是客戶端(手機)和Fiddler這個偽服務端的Https驗證通過了,還沒有到真正的服務端去取數據的,此時Fiddler會以客戶端的身份與真正的服務端再進行一次HTTPS的驗證,最后拿到數據后
又以服務端的身份與客戶端(手機)通信。也就是說在一次請求中數據被兩次加解密,一次是手機到Fiddler,一次是Fiddler到真正的服務端。
整個過程? 手機----》Fiddler----》 服務器? Fiddler 即充當了服務端又充當了客戶端,才使得數據能夠正常的交互,這個過程中最重要的一環就是手機端安裝的 根證書!
致謝
該文章只為個人整理https相關知識所用,各知識點都是扒的其他文章,謝謝以下文章提供資料,希望能對你也有所幫助:
TTPS 原理解析: ? http://www.cnblogs.com/zery/p/5164795.html
百度百科https:? http://baike.baidu.com/item/https
https原理: ? http://www.guokr.com/post/114121/
HTTPS那些事(二)SSL證書: ? http://www.guokr.com/post/116169/
使用 Charles 獲取 https 的數據: ? ?http://www.lxweimin.com/p/235bc6c3ca77