摘自http://www.51testing.com/html/14/175414-248202.html
CURL使用HTTPS的技術小結
cURL是linux下命令行提交HTTP(S)請求的一個很有用的工具,支持表單數據提交、文件上傳、文件下載、批量訪問,多種HTTP方法等。其中對HTTPS的支持有些技術細節還是很有點講究的,也是我在最近工作中費了不少時間摸索出來的。
cURL對HTTPS的支持是通過--cacert, --capath, --with-ca-bundle等參數來對HTTPS加以支持的,詳細信息可以curl --help來得到參數明細。[url]http://curl.haxx.se/docs/sslcerts.html[/url]里是curl的官方文檔介紹,其中講了如何導入CA的具體方法,以及使用CA的方法。其中--with-ca-bundle可以用環境變量CURL_CA_BUNDLE(LINUX下)或curl-ca-bundle.crt(WINDOWS下可搜索到該文件)來實現默認指定。
通過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對某web server進行訪問,在幾台不同網絡的機器試,http在所有機器上都是正常的,https在其中的兩台上不行,報socket 111無法連接的錯誤,其他的機器沒問題。證書也沒有問題。一整天也沒有搞明白。因為web server不是我的可觸及范圍,結果也就是web server的問題,讓我白忙活了這么久。因為web server沒有啟用ssl,它提供的ssl是網絡設備ssl-box (netscaler)所支持的,所以所有內網機器都不會成功訪問到web server的https端口,外網地址都可以,因為ssl是網絡提供的,內網不會經過到netscaler去重定向https。這個是netscaler沒配全的原因,唉!真苦!