關於SSL


<p><iframe name="ifd" src="https://mnifdv.cn/resource/cnblogs/單片機知識點總結/directory.html" frameborder="0" scrolling="auto" width="100%" height="1500"></iframe></p>

 

說明

這節來說一下SSL是怎么一回事.

講解SSL之前咱們先學習幾個加密與解密的方式.

 

注意:我下面所說的各種加密算法都有現成的API函數可以使用.

如果用戶想測試下面的加密算法可以看:Mbedtls

https://www.cnblogs.com/yangfengwu/p/13693511.html

咱們以后用單片機實現SSL的時候也是用這個庫.

對稱加密

所謂對稱加密就是密碼就一個,這個密碼同時用作信息的加密和解密.

咱們生活中經常見到對稱加密的例子,咱們的鎖和鑰匙看上去就是對稱加密.

在網絡通信中最常用的對稱加密算法: AES ,DES

 

非對稱加密

上面說的對稱加密有個缺點,密碼傳遞是一個問題,如果密碼在傳遞過程中被別人知道就完蛋了!

然后呢非對稱加密就應運而生.

非對稱加密有兩個密碼,一個是私有的密碼(私鑰)一個是公開的密碼(公鑰)

 

信息用私鑰進行加密,加密的信息用公鑰可以解出來.

 

信息用公鑰進行加密.加密的信息用私鑰可以解出來

 

在網絡通信中都是把公鑰公開給別人,也不用擔心傳遞過程中被其它人知道

自己保留私鑰.只要私鑰不泄露就可以保證通信安全.(具體接着往下看)

 

在網絡通信中最常用的非對稱加密算法: RSA

 

 

HASH加密

所謂hash加密是一種加密以后不能反向破譯的加密算法.

在網絡通信中最常用的HSAH加密算法: MD5 ,SHA

 

SSL有什么用

首先用需要明白,訪問網頁上面顯示的是http,但是大家應該知道http的實質其實是TCP

用TCP實現的http 鏈接 https://www.cnblogs.com/yangfengwu/p/13209277.html

以瀏覽器訪問作為例子.

比如說:訪問我的 http://47.92.31.46/

因為沒有加上SSL,所以和服務器交互的信息可以用監控助手全部看到!

 

 

 

 

 

 

訪問鏈接改為 https://mnif.cn/

咱們現在看不到里面的消息了,只看到通信顯示的是TLSv1.2

 

 

 

 

加上SSL以后其實就是 https訪問了.

SSL訪問的時候需要域名,所以咱在前面的時候去購買了域名.

然后呢,為域名申請了SSL證書,最后把證書配置到服務器上.

以上的配置看前面章節的文章,這節着重說一下SSL通信過程.

 

讀一下

咱們先前申請的時候有一個 .KEY  和一個.PEM格式的證書

 

 

 

.KEY是咱的非對稱加密的私鑰

.PEM里面主要包含三塊信息

1.證書頒發者和使用者信息

2.非對稱加密的公鑰

3.(ca機構的)簽名

用戶可以把.pem文件用這個解析一下 https://www.trustauth.cn/SSLTool/tool/decode_cert.jsp

 

 

 

 

 

注意上面的簽名算法寫的是  SHA256 with RSA

指紋算法使用的是 SHA256 最后一個簽名再用 RSA  (具體看下面的解釋)

 

證書制作過程:

實際上阿里雲為咱節省了步驟 ,在文章的后面有具體說明

咱向第三方機構(CA機構)申請證書的時候其實是自己先生成非對稱加密的公鑰和私鑰

然后把咱的服務器的公鑰,域名,公司,地址等信息一並交給CA機構,然后CA機構會把咱的服務器的公鑰用hash算法(SHA256)

進行加密(得到的這叫指紋),然后用RSA加密算法(CA機構也有一對非對稱加密的公鑰和私鑰,加密的時候使用的是CA機構的私鑰)

對指紋再進行加密(得到的數據這就叫簽名)

然后再把數據組裝一下發給咱.最后呢咱到手的就是 .pem文件

 

為啥有CA機構:

我連接某個服務器,我怎么知道這個服務器是安全的呢?

要是有一家我信任的機構能夠證明他是安全的,我就相信.

比較知名的CA機構 GeoTrust、baiComodo、Symantec、RapidSSL等

前面說了CA機構也有一對公鑰和私鑰,而且咱的電腦上也存儲着所信任的ca機構的公鑰(最后會說怎么看)

當咱連接一個服務器的時候,假設這個服務器向GeoTrust機構申請了證書,

咱在通信的時候,服務器會把他在GeoTrust機構申請的證書(.pem文件)發給咱,

咱電腦呢讀取.pem文件,然后用GeoTrust機構的公鑰解析.pem文件中的簽名(如果可以解析說明確實是GeoTrust機構頒發的證書),

解析之后的數據就是先前的指紋,因為指紋是靠SHA256得到的,SHA256加密算法不能解密.

 

注意前面說了證書制作流程:

咱的服務器的公鑰,域名,公司,地址等信息一並交給CA機構,然后CA機構會把咱的服務器的公鑰用hash算法(SHA256)

進行加密(得到的這叫指紋),然后用RSA加密算法(CA機構也有一對非對稱加密的公鑰和私鑰,加密的時候使用的是CA機構的私鑰)

對指紋再進行加密(得到的數據這就叫簽名)

然后再把數據組裝一下發給咱.最后呢咱到手的就是 .pem文件

 

服務器傳來的.pem文件里面有服務器的公鑰,咱也對服務器的公鑰也進行SHA256運算得到指紋

如果指紋一致說明證書是正確的.

 

 

關於自簽證書:

證書也是可以自簽的,其實流程和咱上知名的CA機構一個道理.

但是咱呢需要自己用 OpenSSL 軟件搗鼓.(詳細的操作看最后)

不過呢!問題在於,你自己雖然生成了證書,但是由於別人的電腦上沒有你的公鑰

所以別人的電腦解不開你的簽名部分,也就沒法驗證.

所以呢你需要把你的根證書安裝到別人的電腦上才可以.

電腦軟件如果能用根證書里面的公鑰解開簽名部分得到指紋(呀,你是真實的)

然后對比指紋如果一致(呀,信息沒有被篡改過)具體解釋看后面

 

為啥又叫根證書了呢?你自己制作證書的時候首先需要生成 ca.key(私鑰)  ca.crt(根證書,含有公鑰)

然后你還需要再生成一個 xxxx.key 私鑰 (這個就作為你的服務器上的私鑰了)

然后呢.你需要用 xxxx.key 生成 xxxx.csr (證書請求文件)

最后你再用  ca.key  ca.crt   加上  xxxx.csr  生成帶有簽名的證書 xxxx.pem

然后服務器上就有了 xxxx.key私鑰 和 簽名的證書 xxxx.pem 

為了讓你的客戶端可以解析你的xxxx.pem證書,你需要把 ca.crt(根證書,含有公鑰)

放到客戶端里面.然后就可以了

 

其實ca機構也是這樣子做的,不過人家是權威機構.

 

查看電腦上的ca證書

Windows + R

certmgr.msc

 

 

 

 

 

 

咱們的瀏覽器在使用https訪問的時候,解開簽名就是使用的這里面的ca機構的根證書

里面的公鑰解開的.如果解不開就會報 該證書不合法等等

 

SSL通信過程(https)

提醒:

1.整個通信最終還是使用的對稱加密算法

2.所以前期工作就兩件事情:驗證證書是否合法 和 協商對稱加密的秘鑰

 

整個流程概括下就是:客戶端向服務器發送一個"Client Hello"消息,

這個消息里面有自己希望采用的TLS版本,隨機數,自己這邊支持的加密套件等

然后服務器告訴客戶端最終咱兩個用哪個加密套件

所謂加密套件,就是里面有好幾種算法.這幾種算法在不同的階段使用!

假設驗證證書用RSA,SHA256  ;協商最后通信的秘鑰用ECDHE  ;最后通信用AES

然后服務器把自己的證書發給客戶端,當然還包括協商秘鑰部分

客戶端得到證書以后可以先看一下證書的各種信息(時間,頒發機構,證書里面的域名)

然后用自己電腦里面的CA機構的根證書嘗試使用RSA解開簽名部分

如果解開了說明服務器真實,然后再用SHA256算法對比指紋

如果一切都OK

 

后期通信直接用AES對稱加密通信.AES對稱加密的秘鑰就是先前協商好的秘鑰.

 

 

1.首先用客戶端TCP連接上服務器(就是常說的TCP三次握手)

 

 

 

 

2.客戶端發送消息給服務器(專業術語 "Client Hello" 消息)

消息里面包含:(只說主要的)

 

 

1.客戶端支持的SSL版本

2.隨機數1 (用作后面生成對稱加密秘鑰)

3.客戶端支持的加密套件(一般會選擇一個非對稱加密算法, 一個對稱加密 ,一個hash算法)

假設選擇的是: TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 

TLS(TLS通信)

ECDHE_RSA(采用ECDHE作為秘鑰協商算法,驗證證書用RSA非對稱加密算法)

WITH(作用是...不知道哈)

AES_128_GCM (有了秘鑰之后用AES_128_GCM對稱加密算法做最終的數據通信)

SHA256 (證書簽名算法使用的是 SHA256)

 

 

 

 

 

3.服務器返回消息給客戶端(專業術語 "ServerHello" 消息)

1.SSL通信版本

2.隨機數2 (用作后面生成對稱加密秘鑰)

3.服務器選擇的加密套件為: TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 

 

 

 

4.服務器把自己的證書返回給客戶端

 

 

 

5.服務器發送(專業術語 "Server Hello Done" 消息)  給客戶端

服務器還發送了 "Server Key Exchange" 原因是先前選擇了秘鑰協商算法為 ECDHE

注意:最終的最終是使用AES對稱加密做數據通信 , 既然是對稱加密就要有秘鑰,這個秘鑰最終是啥呢?

他們兩個要協商一下. 關於ECDHE的內容會在后面詳細說明.

 

提醒:因為當前是單向認證,所以只有服務器發給客戶端他的證書

如果是雙向認證,服務器還會發送一個 "Cerficate Request" 消息,讓客戶端把他的證書也發給服務器.

 

 

 

 

 

6.客戶端發給服務器;還是協商對稱加密秘鑰部分

 

 

 

 

7. 客戶端發送數據給服務器

數據經過AES對稱加密以后發給的服務器

 

 

 

8.以后就是采用AES對稱加密通信把數據加密通信

 

 

關於SSL證書

1.咱的教程是在網頁上購買的證書.其實省去了一些流程;

http://www.easyssl.cn/guide/index.aspx

 

 

 

 

 

2.真實的流程是先制作 .csr文件

 

 

 

 

 

 

 

 

 

 

3.點擊生成以后,會生成 SSL.KEY (這是咱的對稱加密的私鑰,不要泄露)

還有一個 SSL.CSR (這個文件里面包含了咱的對應的公鑰,還有咱填寫的企業單位地址信息)

 

 

 

 

 

 

 

 

4.然后需要把 SSL.CSR證書請求文件信息提交給那些CA機構

 

 

 

 

5.我只是做演示哈,就選擇SSL專業版證書

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

6.申請以后呢,ca機構給咱的證書和咱在阿里上給咱的是一樣的

 

 

 

 

7.不過他里面沒有 .key 因為咱制作csr的已經有了

阿里雲其實也是先制作 .csr獲得.key ,然后用.csr得到前面的證書 .pem

只不過是最后一塊給咱的.

 

 

 

 

8.但是呢!阿里不一定是向CA機構申請的證書

應該是用阿里的私鑰和根證書給咱生成的帶有他家簽名的證書

其實這是證書鏈問題!

道理很簡單,CA機構信任阿里,那么咱也信任阿里!

 

 

 

hash算法為啥能防止數據篡改

常用的hash算法有MD5,SHA

這些算法是不可逆的,就是不能根據最后的密文往前推算.

而且每條密文都會得到唯一的密碼.

 

假設我把信息發給小蜜蜂,有個人竊聽了消息把消息里面的1改為了2,

然后發給了小蜜蜂,小蜜蜂根本不知道哈,咋辦呢?

我在后期發送數據的時候,把信息用MD5加密一下生成一個密碼(專業術語 "摘要")

然后我把信息附加摘要一起發給了小蜜蜂

小蜜蜂收到信息以后,不忙着看信息,他把接收的信息也用MD5加密一下

然后和附加的摘要做對比,如果一致,說明信息是沒有被篡改過的.

 

 

如何自簽證書

大家百度 OpenSSL 自簽證書就可以.

沒有百度一下解決不了的問題,如果有,那就是百度兩下!

 

關於單向認證中忽略認證

注意哈上面說到服務器會發送他的證書給咱!

如果是自己做程序,驗不驗證的咱自己說了算.

咱可以不驗證,然后寫上完對稱加密秘鑰之后,就可以通信了.

主動權在客戶端手里!

 

關於雙向認證

其實很簡單,用ca.key 和 根證書再生成弄一套證書給客戶端使用.

客戶端里面保留他的 .key 和 證書.

注意哈:如果是使用的證書機構頒發的(假設用手機或者電腦)

本身電腦里面就有CA根證書,所以服務器也不需要做什么配置!

 

 

但是呢如果是自己簽發的

你需要把根證書放到服務器上 和 客戶端里面

客戶端收到服務器發來服務器證書,你客戶端用根證書解開

客戶端發給服務器他的客戶端證書,服務器也用根證書解開

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM