在互聯網安全通訊方式上,目前用的最多的就是https配合ssl和數字證書來保證傳輸和認證安全了。本文追本溯源圍繞這個模式談一談。html
首先解釋一下上面的幾個名詞:算法
所以,這三者的關係已經十分清楚了:https依賴一種實現方式,目前通用的是SSL,數字證書是支持這種安全通訊的文件。另外有SSL衍生出TLS和WTLS,前者是IEFT將SSL標準化以後產生的(TSL1.0),與SSL差異很小,後者是用於無線環境下的TSL。windows
在散列算法(也稱摘要算法)中,有兩個概念,強無碰撞和弱無碰撞。弱無碰撞是對給定的消息x,就是對你想僞造的明文,進行運算得出相同的摘要信息。也就是說你能夠控制明文的內容。強無碰撞是指能找到相同的摘要信息,但僞造的明文是什麼並不知道。api
須要注意的是非對稱加解密算法的效率要比對稱加解密要低的多。因此SSL在握手過程當中使用非對稱密碼算法來協商密鑰,實際使用對稱加解密的方法對http內容加密傳輸。下面是對這一過程的形象的比喻(摘自http://blog.chinaunix.net/u2/82806/showart_1341720.html):瀏覽器
假設A與B通訊,A是SSL客戶端,B是SSL服務器端,加密後的消息放在方括號[]裏,以突出明文消息的區別。雙方的處理動做的說明用圓括號()括起。緩存
A:我想和你安全的通話,我這裏的對稱加密算法有DES,RC5,密鑰交換算法有RSA和DH,摘要算法有MD5和SHA。安全
B:咱們用DES-RSA-SHA這對組合好了。服務器
這是個人證書,裏面有個人名字和公鑰,你拿去驗證一下個人身份(把證書發給A)。網絡
A:(查看證書上B的名字是否無誤,並經過手頭早已有的數字的證書驗證了B的證書的真實性,若是其中一項有誤,發出警告並斷開鏈接,這一步保證了B的公鑰的真實性)網站
(產生一份祕密消息,這份祕密消息處理後將用做對稱加密密鑰,加密初始化向量和hmac的密鑰。將這份祕密消息-協議中稱爲per_master_secret-用B的公鑰加密,封裝成稱做ClientKeyExchange的消息。因爲用了B的公鑰,保證了第三方沒法竊聽)
我生成了一份祕密消息,並用你的公鑰加密了,給你(把ClientKeyExchange發給B)
注意,下面我就要用加密的辦法給你發消息了!
(將祕密消息進行處理,生成加密密鑰,加密初始化向量和hmac的密鑰)
[我說完了]
B:(用本身的私鑰將ClientKeyExchange中的祕密消息解密出來,而後將祕密消息進行處理,生成加密密鑰,加密初始化向量和hmac的密鑰,這時雙方已經安全的協商出一套加密辦法了)
注意,我也要開始用加密的辦法給你發消息了!
[我說完了]
A: [個人祕密是...]
B: [其它人不會聽到的...]
從上面的過程能夠看到,SSL協議是如何用非對稱密碼算法來協商密鑰,並使用密鑰加密明文並傳輸的。還有如下幾點補充:
1.B使用數字證書把本身的公鑰和其餘信息包裝起來發送A,A驗證B的身份,下面會談到A是如何驗證的。
2.A生成了了加密密鑰、加密初始化向量和hmac密鑰是雙方用來將明文摘要和加密的。加密初始化向量和hmac密鑰首先被用來對明文摘要(防止明文被篡改),而後這個摘要和明文放在一塊兒用加密密鑰加密後傳輸。
3.因爲只有B有私鑰,因此只有B能夠解密ClientKeyExchange消息,並得到以後的通訊密鑰。
4.事實上,上述過程B沒有驗證A的身份,若是須要的話,SSL也是支持的,此時A也須要提供本身的證書,這裏就不展開了。在設置IIS的SSL Require的時候,一般默認都是igore client certification的。
由上面的討論能夠知道,數字證書在ssl傳輸過程當中扮演身份認證和密鑰分發的功能。究竟什麼是數字證書呢?
簡而言之數字證書是一種網絡上證實持有者身份的文件,同時還包含有公鑰。一方面,既然是文件那麼就有可能「僞造」,所以,證書的真僞就須要一個驗證方式;另外一方面,驗證方須要認同這種驗證方式。
對於第一個需求,目前的解決方案是,證書能夠由國際上公認的證書機構頒發,這些機構是公認的信任機構,一些驗證證書的客戶端應用程序:好比瀏覽器,郵件客戶端等,對於這些機構頒發的證書徹底信任。固然想要請這些機構頒發證書但是要付「到了斯」的,一般在windows部署系統的時候會讓客戶端安裝咱們本身服務器的根證書,這樣客戶端一樣能夠信任咱們的證書。
對於第二個需求,客戶端程序一般經過維護一個「根受信任機構列表」,當收到一個證書時,查看這個證書是不是該列表中的機構頒發的,若是是則這個證書是可信任的,不然就不信任。
所以做爲一個https的站點須要與一個證書綁定,不管如何,證書老是須要一個機構頒發的,這個機構能夠是國際公認的證書機構,也能夠是任何一臺安裝有證書服務的計算機。客戶端是否可以信任這個站點的證書,首先取決於客戶端程序是否導入了證書頒發者的根證書。下圖說明了這個流程:
有時一個證書機構可能受權另外一個證書機構頒發證書,這樣就出現了證書鏈。
IE瀏覽器在驗證證書的時候主要從下面三個方面考察,只要有任何一個不知足都將給出警告
另外,瀏覽器還會按期查看證書頒發者公佈的「證書吊銷列表」,若是某個證書雖然符合上述條件,可是被它的頒發者在「證書吊銷列表」中列出,那麼也將給出警告。每一個證書的CRL Distribution Point字段顯示了查看這個列表的url。儘管如此,windows對於這個列表是「不敏感」的,也就是說windows的api會緩存這個列表,直到設置的緩存過時纔會再從CRL Distribution Point中下載新的列表。目前,只能經過在證書頒發服務端儘可能小的設置這個有效期(最小1天),來儘可能使windows的客戶端「敏感」些。具體設置方法爲(winserver2003):