寫在前面
https協議還是挺復雜的,本人也是經過了很多次的學習,依然感覺一知半解,無法將所有的知識點串起來,本次學習呢,也是有很多的疑惑點,但是還是盡量的輸出內容,來幫助自己和在看文章的你來共同進步吧!
為了更加系統,行文采用線性的方式來進行,遇到一些點的話再單獨展開說明。接下來我們就以https協議本身作為切入點開始吧!
1:https協議的流程
我們靜下心來一步步的來看啊。首先客戶端給服務端說:您好,我這邊的加密套路是這樣的,給你個隨機數,后面有用
,隨機數后續使用,這個在https協議里叫client hello
,接著服務端回復您好,我這邊的加密套路是這樣的,也給你個隨機數
,隨機數也是后續使用,這個在https協議里叫server hello
,如下方式抓包看下:
抓包看如下:
client hello可以看到加密套件信息:
接著是服務端給客戶端發送這是我的證書,你也審核一下吧
,這個過程叫client certificate
,客戶端收到服務端的證書后,通過自己內置的CA證書的公鑰來解密信息,如果是能夠解密則說明服務端的證書是找了合法的CA機構生成的(合法CA機構的公鑰都是公開的,會內置在操作系統中,所以千萬不要安裝來路不明的操作系統,要不然你銀行卡里的13塊錢的余額怎么沒的都不知道)
。其中加密生成簽名和驗證簽名的過程如下圖:
這樣客戶端在驗證了服務端的證書后繼續后續流程,客戶端給服務端發送將隨機數字使用公鑰加密傳輸
,協議里叫Client Key Exchange
,注意這里的公鑰是服務端在CA機構簽過名的公鑰,即和服務端自己維護的私鑰是配對的(注意和CA的私鑰公鑰區分)
,服務端收到加密的隨機數字后,就可以使用自己保密存儲的私鑰來解密,獲取這個隨機數字了。接著客戶端和服務端會使用前面流程的隨機數們計算出相同的密鑰,作為后續數據交換對稱加密使用的密鑰。
獲取密鑰之后,為了確保各自的密鑰好使,會進行一些testing看下,就是下面的交互過程:
最后就是正常加密通信過程了:
關于證書是如何生成的我們在第二部分來看下。
2:證書
在https協議中有一個很重要的角色就是證書,什么是證書呢?證書的作用就是來證明服務的身份,以及服務端公鑰的合法性,如果是CA簽發的證書的話(背書)
,就是合法的證書,是能夠使用操作系統內置的CA公鑰解密的,瀏覽器會認為是其實安全的,如下:
反之不安全的會提示:
我們來看下這個過程,比如你創建了一個網站現在要使用https的安全傳輸協議,首先要做的就是生成網站使用的私鑰:
[root@host-10-150-27-148 x]# openssl
OpenSSL> genrsa -des3 -out server.key 1024
Generating RSA private key, 1024 bit long modulus
.....++++++
....................++++++
e is 65537 (0x10001)
Enter pass phrase for server.key:
Verifying - Enter pass phrase for server.key:
OpenSSL>
這樣網站的私鑰就有了(千萬要保密保存不要泄露)
,接著通過私鑰生成網站的證書請求文件(里面有網站公鑰信息【通過私鑰生成】,域名,郵箱等信息【提示我們錄入的】)
,后續需要發送給CA生成簽名證書,生成請求文件過程如下:
OpenSSL> req -new -key server.key -out server.csr
Enter pass phrase for server.key:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:BJ
Locality Name (eg, city) [Default City]:beijing
Organization Name (eg, company) [Default Company Ltd]:hc
Organizational Unit Name (eg, section) []:bj
Common Name (eg, your name or your server's hostname) []:dnogdashuaige
Email Address []:3454@qq.comPlease enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:111111
An optional company name []:dahuyou
接著我們就可以將server.csr交給CA機構生成簽名證書了,但是真的生成是要錢的,所以我們這里來模擬。
我們知道CA生成簽名也是通過自己的私鑰來進行的,所以先來模擬生成私鑰等信息:
OpenSSL> genrsa -des3 -out ca.key 1024
Generating RSA private key, 1024 bit long modulus
.......++++++
...........++++++
e is 65537 (0x10001)
Enter pass phrase for ca.key:
Verifying - Enter pass phrase for ca.key:
此時還不能簽名,還需要通過私鑰導出用來給其他公鑰生成簽名的根證書,如下:
OpenSSL> req -new -x509 -key ca.key -out ca.crt -days 365
Enter pass phrase for ca.key:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:bj
Locality Name (eg, city) [Default City]:bj
Organization Name (eg, company) [Default Company Ltd]:hc
Organizational Unit Name (eg, section) []:bj
Common Name (eg, your name or your server's hostname) []:dahuyou
Email Address []:222@ff.com
這樣,一個冒牌
的CA就有了,可以使用ca.crt
來簽名生成證書了。
好,接著來生成證書啦:
OpenSSL> x509 -req -in server.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out server.crt -days 365
Signature ok
subject=/C=CN/ST=BJ/L=beijing/O=hc/OU=bj/CN=dnogdashuaige/emailAddress=3454@qq.com
Getting CA Private Key
Enter pass phrase for ca.key:
這里生成的server.crt
就是在https協議交互過程中服務端給客戶端的證書了。
寫在后面
參考文章列表
openssl生成自簽名證書(完整版)。
分布式之拜占庭問題。
圖文詳解HTTPS協議通信全過程,結合抓包實戰分析,帶你一次看透HTTPS!零基礎入門到精通,收藏這一篇就夠了。