當(dāng)我們配置https時(shí)我們在配置什么

當(dāng)我們想讓我們的網(wǎng)站支持https時(shí),我們需要做什么,以及這些過程中的原理是什么呢?

申請并配置一個(gè)HTTPS證書

我們先從申請者的視角觸發(fā)

首先我們要生成一對密鑰

#私鑰
openssl genrsa -out server.key 1024
#公鑰
openssl rsa -in server.key -pubout -out server.pub

然后我們要把公鑰跟其他一些信息打包起來成為一個(gè)叫做csr(Certificate Signing Request)的文件

openssl req -new -key server.pub -out server.csr
#接下來會(huì)提示你輸入一些信息,比如申請域名、服務(wù)器所在地等

得到這個(gè)server.csr文件之后,我們把這個(gè)csr提交給CA(Certificate authority)

然后我們把視角切換到CA。

我們在這里先討論根CA的情況,即CA的證書是自己生成而非由另一個(gè)CA頒發(fā)的情況。
CA在成為CA的時(shí)候,他首先創(chuàng)建自己的一對密鑰ca.keyca.pub以及相應(yīng)的ca.csr,然后使用以下代碼進(jìn)行自簽發(fā)

openssl x509 -req -days 365 -sha1 -extensions v3_ca -signkey \
ca.key-in ca.csr -out ca.crt

得到一個(gè)ca.crt文件,這就是CA的證書
當(dāng)CA收到申請者的server.csr文件后,會(huì)先通過一些方法驗(yàn)證這個(gè)申請者的資格,跟證書的原理無關(guān),我們略過。然后用以下代碼進(jìn)行簽發(fā)

openssl x509 -req -days 365 -sha1 -extensions v3_req -CA ca.cer -CAkey ca.key\
-CAserial ca.srl -CAcreateserial -in server.csr -out server.crt
#其中ca.srl是一個(gè)證書序列文件,相當(dāng)于給每個(gè)簽發(fā)的證書一個(gè)唯一編號,這里不詳述

這段代碼大概做了這些事:

  • server.csrca.csr里的信息一起做一個(gè)散列計(jì)算,得到一個(gè)hash值,我們標(biāo)記為s_hash
  • 用CA的私鑰ca.key給這段s_hash加密,得到s_sign,就是我們一般說的簽名
  • 然后把這段s_sign和之前的server.csr以及ca.csr組合起來,就成為頒發(fā)給申請者的證書server.crt
    如果是二級及以上CA,實(shí)際上只需要把自簽發(fā)部分換成找上級CA簽發(fā)就行。
再把視角轉(zhuǎn)回申請者

這時(shí)候我們得到了CA返回的server.crt證書了,如何配置呢?我們這里以nginx舉例
在nginx配置里寫上這樣的代碼

ssl_certificate /your_path/server.crt;
ssl_certificate_key /your_path/server.key;

服務(wù)器端的配置至此結(jié)束,接下來我們看看https使用時(shí)的流程

https通訊過程

客戶端(操作系統(tǒng)或?yàn)g覽器)在發(fā)起一個(gè)HTTPS請求的時(shí)候,會(huì)把一組加密算法(對稱加密)和一個(gè)隨機(jī)數(shù)CilentRandom發(fā)送給服務(wù)器。

服務(wù)器從這些算法中選出一個(gè),并生成一個(gè)隨機(jī)數(shù)ServerRandom,把這些數(shù)據(jù)和自己的證書返回給客戶端。

客戶端收到服務(wù)器證書之后,查看這個(gè)證書的頒發(fā)機(jī)構(gòu)是否受信任(通常操作系統(tǒng)或?yàn)g覽器都會(huì)自帶一個(gè)信任CA列表)。
具體方法是
1.查看服務(wù)器證書server.crt中的CA字段,是否在信任列表中,若否,則直接判定不可信。需要注意的是這里會(huì)把整個(gè)證書鏈都進(jìn)行驗(yàn)證,直到根證書。
2.使用記錄的CA公鑰來解密server.crt中的簽名,就是上文提到的s_sign,得到s_hash_1,然后再把server.crt中的其他信息進(jìn)行HASH計(jì)算,得到s_hash_2,如果二者匹配,則說明證書可信。

確認(rèn)證書可信之后,客戶端再生成一個(gè)隨機(jī)數(shù)PremasterSecret,并使用證書中的服務(wù)器公鑰進(jìn)行RSA加密,得到消息A,發(fā)送給服務(wù)器。

服務(wù)器使用自己的私鑰對消息A進(jìn)行RSA解密,得到PremasterSecret

此時(shí),客戶端和服務(wù)器都同時(shí)擁有了CilentRandomServerRandom,PremasterSecret三個(gè)隨機(jī)數(shù),用協(xié)議規(guī)定的方式組合成SessionKey。至此https握手階段完成,接下來就是普通的http請求,只是數(shù)據(jù)都用約定好的加密方式和SessionKey進(jìn)行對稱加密。

待回答的問題

我們?yōu)槭裁匆褂肏TTPS而不是普通的HTTP?HTTPS是否真的可靠?上文提到的對稱加密和非對稱加密又有什么區(qū)別?

To be continue
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容