關於curl訪問https的若干問題

2021-06-25 21:42:37 字數 3583 閱讀 2159

https是在ssl協議之上實現的http協議(get、post等操作)。

介紹一下ssl的握手過程:

①客戶端的瀏覽器向伺服器傳送客戶端 ssl 協議的版本號,加密演算法的種類,產生的隨機數,以及其他伺服器和客戶端之間通訊所需要的各種資訊。  

②伺服器向客戶端傳送 ssl 協議的版本號,加密演算法的種類,隨機數以及其他相關資訊,同時伺服器還將向客戶端傳送自己的證書。  

③客戶利用伺服器傳過來的資訊驗證伺服器的合法性,伺服器的合法性包括:證書是否過期,發行伺服器證書的 ca 是否可靠,發行者證書的公鑰能否正確解開伺服器證書的「發行者的數字簽名」,伺服器證書上的網域名稱是否和伺服器的實際網域名稱相匹配。如果合法性驗證沒有通過,通訊將斷開;如果合法性驗證通過,將繼續進行第四步。  

④使用者端隨機產生乙個用於後面通訊的「對稱密碼」,然後用伺服器的公鑰(伺服器的公鑰從步驟②中的伺服器的證書中獲得)對其加密,然後將加密後的「預主密碼」傳給伺服器。  

⑤如果伺服器要求客戶的身份認證(在握手過程中為可選),使用者可以建立乙個隨機數然後對其進行資料簽名,將這個含有簽名的隨機數和客戶自己的證書以及加密過的「預主密碼」一起傳給伺服器。  

⑥如果伺服器要求客戶的身份認證,伺服器必須檢驗客戶證書和簽名隨機數的合法性,具體的合法性驗證過程包括:客戶的證書使用日期是否有效,為客戶提供證書的ca 是否可靠,發行ca 的公鑰能否正確解開客戶證書的發行 ca 的數字簽名,檢查客戶的證書是否在證書廢止列表(crl)中。檢驗如果沒有通過,通訊立刻中斷;如果驗證通過,伺服器將用自己的私鑰解開加密的「預主密碼」,然後執行一系列步驟來產生主通訊密碼(客戶端也將通過同樣的方法產生相同的主通訊密碼)。  

⑦伺服器和客戶端用相同的主密碼即「通話密碼」,乙個對稱金鑰用於 ssl 協議的安全資料通訊的加解密通訊。同時在 ssl 通訊過程中還要完成資料通訊的完整性,防止資料通訊中的任何變化。  

⑧客戶端向伺服器端發出資訊,指明後面的資料通訊將使用的步驟⑦中的主密碼為對稱金鑰,同時通知伺服器客戶端的握手過程結束。  

⑨伺服器向客戶端發出資訊,指明後面的資料通訊將使用的步驟⑦中的主密碼為對稱金鑰,同時通知客戶端伺服器端的握手過程結束。  

⑩ssl 的握手部分結束,ssl 安全通道的資料通訊開始,客戶和伺服器開始使用相同的對稱金鑰進行資料通訊,同時進行通訊完整性的檢驗。  

單向認證模式:

對於面向公眾使用者的https的**,大部分屬於這種,它不需要對客戶端進行認證,不需要提供客戶端的個人證書,例如

雙向認證模式:

為了驗證客戶端的合法性,要求客戶端在訪問伺服器時,出示自己的被授權過的客戶端證書。

如果在linux下開發應用的話,可以借助curl這個命令列工具,它提供命令列操作方式、libcurl庫函式使用方式。

curl對https的支援是通過

--cacert, --capath, --with-ca-bundle

等引數來對https加以支援的,詳細資訊可以

curl --help

來得到引數明細。

是curl的官方文件介紹,其中講了如何匯入ca的具體方法,以及使用ca的方法。

其中--with-ca-bundle可以用環境變數curl_ca_bundle(linux下)或curl-ca-bundle.crt(windows下可搜尋到該檔案)來實現預設指定。

如果在linux下開發應用的話,可以借助curl這個命令列工具,它提供命令列操作方式、libcurl庫函式使用方式。

下面講講https的證書:

通過ie或其他瀏覽器訪問https伺服器我們可以很容易得到ssl的x.509安全證書,證書匯出可以選擇編碼格式,我們通常選擇der或者base64編碼方法,匯出檔案為cer字尾。需要注意的是對於openssl生成crt證書檔案時--info引數會有區別。如對der編碼檔案命令應該是

openssl x509 -inform des -in /aaa-der.cer -text -out /.aaa-der.crt
其中aaa-der.cer是瀏覽器裡匯出的x.509證書檔案,aaa-der.crt是加密ca證書被curl所需載入驗證的。如果匯出用base64編碼匯出的,則命令列應該改為

openssl x509 -inform pem -in /aaa-b64.cer -text -out /.aaa-b64.crt
其中-inform引數需要改為pem,來對應編碼格式base64。

另外,x.509證書如果是三層以上的,即除了底層的url外,上面還有兩層以上的,則說明該證書是乙個證書夾,即便裡面只有乙個證書。

用在curl時需作為--capath的引數值代入才能生效; 反之,如果只有兩層的,即除了底層的url外,上面只有一層的,則說明該證書只是乙個證書,用在curl裡需作為--cacert裡的引數值才能生效。

證書在curl裡能被通過必須具備以下三個條件:

1、被ca簽證過的證書;

2、期限有效的;

3、url能匹配請求。

其中第三個可以用過hosts新增ip-name對來實現欺騙,如果伺服器的ssl證書屬於複製使用的話。

curl -k
注意-k的目的就是讓curl不對伺服器的https證書認證。

現在介紹如何使用curl來訪問雙向認證的https站點。

一、準備工作

1、首先,因為要進行客戶端認證,你應該具有了客戶端的個人證書(對於公司內網,通常是由it的管理員頒發給你的),只要你能夠順利的訪問雙向認證的https站點,你就具有了個人證書,它藏在瀏覽器上。我們要做的工作,只是把它從瀏覽器中匯出來。從ie瀏覽器匯出來的格式,通常為.pfx格式,從firefox匯出來的格式通常為.p12格式,其實pfx=p12,它們是同乙個東西,對於curl而言這種格式稱為pkcs#12檔案。

2、把p12格式轉換為pem格式(假設你的p12檔名為:***.p12):

openssl pkcs12 -in ***.p12 -out client.pem -nokeys         //客戶端個人證書的公鑰
openssl pkcs12 -in ***.p12 -out key.pem -nocerts -nodes  //客戶端個人證書的私鑰
也可以轉換為公鑰與私鑰合二為一的檔案: 

openssl pkcs12 -in ***.p12 -out all.pem -nodes              //客戶端公鑰與私鑰,一起存在all.pem中

在執行過程中,可能需要你輸入匯出證書時設定的密碼。執行成功後,我們就有了這些檔案:client.pem——客戶端公鑰,key.pem——客戶端私鑰,或者二合一的all.pem。

二、執行curl命令

1、使用client.pem+key.pem

curl -k --cert client.pem --key key.pem
2、使用all.pem

curl -k --cert all.pem
使用-k,是不對伺服器的證書進行檢查,這樣就不必關心伺服器證書的匯出問題。

本文參考

本文參考

curl使用 https訪問

訪問自己的https伺服器 自己在阿里雲上搭建了乙個https伺服器,以前一直用的是postman作為客戶端訪問,現在想嘗試用curl。下面的終端是 外網深度學習伺服器 所訪問的伺服器是我自己的阿里雲 curl cert client.crt key client.key insecure http...

CURL使用SSL證書訪問HTTPS

curl詳細選項說明 url 若服務端要求客戶端認證,需要將pfx證書轉換成pem格式 openssl pkcs12 clcerts nokeys in cert.pfx out client.pem 客戶端個人證書的公鑰 openssl pkcs12 nocerts nodes in cert.p...

CURL使用SSL證書訪問HTTPS

curl詳細選項說明 url 若服務端要求客戶端認證,需要將pfx證書轉換成pem格式 openssl pkcs12 clcerts nokeys in cert.pfx out client.pem 客戶端個人證書的公鑰 openssl pkcs12 nocerts nodes in cert.p...