1. 程式人生 > >使用libevhtp搭建HTTPS SERVER(雙向驗證身份)

使用libevhtp搭建HTTPS SERVER(雙向驗證身份)

本文主要介紹使用libevhtp搭建一個HTTPS SERVER的方法,非加密的HTTP SERVER搭建方法,請點選此處 (本文的構建環境繼承自該部落格)。

本文將針對“雙向驗證身份”場景,介紹HTTPS SERVER的搭建方法。“單向驗證身份”的場景,請點選此處

1. 雙向驗證身份

有的時候,客戶端通過輸入賬號和密碼向伺服器端展示自己的身份的方式太過繁瑣,尤其是在客戶端並不是一個人、而只是一個程式的時候。這種情況下,我們希望客戶端與服務端雙方都利用一個身份證(certificate)通過SSL/TLS協議向對方展示自己的身份。

根據單向身份驗證的方法,如果讓通訊雙方互相交換身份證,就可以實現互相驗證了,但是如果一個分散式系統裡有多方都需要進行通訊, 如果任意兩方都要交換身份證的話就太麻煩了。所以,我們通常建立一個自簽署的根身份證(root CA),然後用它來簽署分散式系統中各方的身份證,這樣每一方都只要有這個根身份證,即可驗證所有其他的通訊方了。

我們可以通過以下步驟搭建雙向驗證身份的HTTPS SERVER。在本文中,我們將使用一個CA來簽署HTTPS伺服器的身份證。

1.1 建立CA

1. 建立我們自己CA的祕鑰對(RSA)檔案:

openssl genrsa -out "ca-key.pem" 2048

2. 建立我們自己CA的身份證申請(CSR)檔案,並且用CA自己的私鑰自簽署該CSR,得到CA的身份證:

openssl req -x509 -new -key ca-key.pem -days 365 -out ca-crt.pem -subj "/CN=we-as-ca"

通過上述步驟,我們可以得到了自己CA的祕鑰對檔案和證書檔案。

1.2 使用CA簽署伺服器的證書檔案

1. 生成伺服器的祕鑰對(RSA)檔案:

openssl genrsa -out server-key.pem 2048

2. 生成伺服器的身份證申請(CSR)檔案:

openssl req -new -key server-key.pem -out server-csr.pem -subj "/CN=192.168.213.133"  

3. 使用前面生成的CA簽署伺服器的證書(CRT)檔案:

openssl x509 -req -in server-csr.pem -CA ca-crt.pem -CAkey ca-key.pem -CAcreateserial -out server-crt.pem -days 365

經過上述步驟,我們得到了HTTPS伺服器的祕鑰檔案server-key.pem和經過CA簽署的伺服器證書檔案server-crt.pem。

說明:上述步驟中的引數需要根據實際情況進行調整。

1.3 使用CA簽署客戶端的證書檔案

1. 生成客戶端的祕鑰對(RSA)檔案:

openssl genrsa -out client-key.pem 2048

2. 生成客戶端的身份證申請(CSR)檔案:

openssl req -new -key client-key.pem -out client-csr.pem -subj "/CN=192.168.213.129" 

3. 使用前面生成的CA簽署客戶端的證書(CRT)檔案:

openssl x509 -req -in client-csr.pem -CA ca-crt.pem -CAkey ca-key.pem -CAcreateserial -out client-crt.pem -days 365

經過上述步驟,我們得到了連線HTTPS伺服器的客戶端的祕鑰檔案client-key.pem和經過CA簽署的客戶端證書檔案client-crt.pem。

說明:上述步驟中的引數需要根據實際情況進行調整。

1.4 呼叫libevhtp介面,構建HTTPS伺服器

本文的HTTPS伺服器程式碼及程式使用“單向驗證身份”場景的內容,請前往該文章檢視。

1.5 測試HTTPS伺服器

開啟一個終端,執行生成的HTTPS伺服器程式,如下:

./https_server -cert cassl/server-crt.pem -key cassl/server-key.pem -ca cassl/ca-crt.pem -verify-peer -verify-depth 2 -enforce-peer-cert

在上述命令中,我們通過指定相關引數(-verify-peer),要求伺服器對客戶端進行認證,即實現雙向認證場景。

在客戶端機器上,開啟一個終端,使用curl命令測試HTTPS伺服器,如下:

curl https://192.168.213.133:4443/ -k --key cassl/client-key.pem --cert cassl/client-crt.pem

上面的curl命令的執行結果如下:


如果客戶端的終端中出現上述資訊,說明雙向身份驗證的HTTPS伺服器部署成功了。

說明:curl的-k選項會允許curl執行不安全的SSL連線和資料傳輸,使用-k選項時,客戶端將不再檢查“簽署https server身份證的CA身份證”。所以,前面的curl測試命令也可以換成如下命令:

curl https://192.168.213.133:4443/  --cert cassl/client-crt.pem --key cassl/client-key.pem --cacert cassl/ca-crt.pem

上述的curl命令中添加了“--cacert”選項,去掉了“-k”選項。該命令的執行結果如下:


客戶端的終端中出現了上述資訊,說明雙向身份驗證的HTTPS伺服器部署成功了。