## SSL/TLS
HTTP使用明文傳輸,明文傳輸主要有一下三大風險:
- 竊聽風險
- 篡改風險
- 冒充風險
SSL/TLS協議就是為了解決這三大風險而設計的,它可以達到如下的效果:
- 所有信息都是加密傳輸,第三方無法竊聽
- 具有校驗機制,一旦被篡改,通信雙方會立即發現
- 配備身份證書,放置身份被冒充
SSL/TLS協議的基本思想就是采用公鑰加密算法。基本過程就是client先向server索要公鑰,然后用公鑰加密信息,服務器收到密文后,用自己的私鑰解密。
這里有幾個問題:
1. 如何保證client收到的server的公鑰不是冒充的?使用CA服務器。
2. 非對稱加密計算量大的問題?每一次對話,client和server都會生成一個對稱加密的密鑰,它用于加密信息,對稱加密的速度非常快。而服務器的公鑰只用于加密那個對稱加密密鑰。
3. client沒有將client的公鑰傳給server,如果server想向client用非對稱加密的方式傳遞信息,那么server只能用server的私鑰給信息加密,然后client用server的公鑰解開。而公鑰是server分發給所有人的,這樣顯然很容易就會發生信息被竊取的情況。需要避免server用server的私鑰加密信息的情況。
## SSL/TLS過程
1. client向server發出加密通信的請求,其中client會生成一個隨機數,稍后用于生成加密信息的對稱密鑰。
2. server收到client請求之后,向client發出回應。server回應的內容包括server的證書、一個server生成的隨機數(稍后用于生成加密信息的對稱密鑰)等。
3. client收到server發的信息之后,首先驗證服務器證書。如果證書不是可信機構頒布、或者證書中的域名與實際域名不一致、或者證書已經過期,就會向訪問者顯示一個警告,由其選擇是否還要繼續通信。如果證書沒有問題,client就會從證書中取出server的公鑰。然后生成一個隨機數作為對稱密鑰,用server的公鑰加密該對稱密鑰。
4. server收到client發送的密文后,用私鑰解開,得到對稱加密的密鑰。至此整個握手階段全部結束。client和server使用對稱密鑰加密內容進行通信。
需要注意的是,SSL/TLS握手階段都是使用的明文傳輸。
## HTTPS
HTTPS實際上就是使用上面SSL/TLS握手,然后用對稱密鑰加密傳輸之前HTTP傳輸的明文內容。
## 數字簽名
數字簽名的作用主要是為了防止內容被篡改。
比如SSL/TLS握手階段,server將自己的公鑰發送給client這個過程是明文傳輸,存在被第三方篡改的風險。
數字簽名的過程是先將內容用hash算法生成摘要,然后使用一個私鑰對摘要進行加密生成數字簽名,然后將數字簽名貼在內容的后面。接收方收到內容后,要驗證內容是否被篡改,只需要將數字簽名用公鑰解密,然后和內容hash之后的結果進行對比,如果不一致,一定發生了篡改。
## CA&數字證書
CA(證書中心)的作用就是給server頒發數字證書,確認server的公鑰是可信的,防止第三方冒充。
server的數字證書:server的公鑰等信息+CA的數字簽名。
server將自己的公鑰等信息交給CA,CA將信息hash之后用自己的私鑰加密生成CA的數字簽名,然后server的公鑰等信息和CA的數字簽名一起封裝成數字證書頒發給server,之后server就使用CA為其頒發的數字證書。client在接受到信息之后,只需要用CA的公鑰驗證一下CA的數字簽名即可知道server的公鑰等信息是否被篡改過。這里為了簡化模型,可以認為client上的CA公鑰一定是可信的。只要client在SSL/TLS握手階段獲得的server公鑰是可信的,中間人是沒有機會竊取、篡改、冒充的。
## 總結
什么時候用公鑰加密信息?什么時候用私鑰加密信息?
加密信息:公鑰加密,私鑰解密。內容不希望被別人看到。
簽名:私鑰簽名,公鑰驗證。讓對方知道是我的發的,不希望被別人冒充、篡改。