一半火、curl介紹
curl,全稱CommandLine URL 或 CommandLine Uniform Resource Locator蛾娶,顧名思義敦腔,curl命令是在命令行方式下工作,利用URL的語(yǔ)法進(jìn)行數(shù)據(jù)的傳輸或者文件的傳輸胞谭。
curl是基于URL語(yǔ)法在命令行方式下工作的文件傳輸工具垃杖,它支持FTP,F(xiàn)TPS丈屹,HTTP调俘,HTTPS,GOPHER泉瞻,TELNET脉漏,DICT,F(xiàn)ILE及LDAP等協(xié)議袖牙。curl支持HTTPS認(rèn)證侧巨,并且支持HTTP的POST,PUT等方法,F(xiàn)TP上傳鞭达,kerberos認(rèn)證司忱,HTTP上傳,代理服務(wù)器畴蹭,cookies坦仍,用戶名/密碼認(rèn)證,通過http代理服務(wù)器上傳文件到FTP服務(wù)器等等叨襟,功能十分強(qiáng)大繁扎。
# yum -y install curl
# curl -V
# yum info curl?
# yum info libcurl
二、關(guān)于https證書
https是在SSL協(xié)議之上實(shí)現(xiàn)的http協(xié)議糊闽,握手過程如下:
單向認(rèn)證模式:
對(duì)于面向公眾用戶的https的網(wǎng)站梳玫,大部分屬于這種,它不需要對(duì)客戶端進(jìn)行認(rèn)證右犹,不需要提供客戶端的個(gè)人證書提澎。
雙向認(rèn)證模式:
為了驗(yàn)證客戶端的合法性,要求客戶端在訪問服務(wù)器時(shí)念链,出示自己的被授權(quán)過的客戶端證書盼忌。
單向認(rèn)證模式與雙向認(rèn)證模式的區(qū)別积糯,就在于第⑤、第⑥步是否要求對(duì)客戶的身份認(rèn)證谦纱,單向不需要認(rèn)證看成,雙向需要認(rèn)證。
目前跨嘉,大公司的OA管理系統(tǒng)(俗稱內(nèi)網(wǎng))绍昂,安全性要求較高,通常采用https的雙向認(rèn)證模式偿荷。
curl對(duì)HTTPS的支持是通過?--cacert, --capath, --with-ca-bundle??等參數(shù)來(lái)對(duì)HTTPS加以支持窘游。
curl的官方文檔:http://curl.haxx.se/docs/sslcerts.html?,講解了如何導(dǎo)入CA的具體方法跳纳,以及使用CA的方法忍饰。
其中--with-ca-bundle可以用環(huán)境變量CURL_CA_BUNDLE(LINUX下)或curl-ca-bundle.crt(WINDOWS下可搜索到該文件)來(lái)實(shí)現(xiàn)默認(rèn)指定。
如果在Linux下開發(fā)應(yīng)用的話寺庄,可以借助curl這個(gè)命令行工具艾蓝,它提供命令行操作方式、libcurl庫(kù)函數(shù)使用方式斗塘。
通過IE或其他瀏覽器訪問HTTPS服務(wù)器我們可以很容易得到SSL的X.509安全證書赢织,證書導(dǎo)出可以選擇編碼格式,我們通常選擇DER或者BASE64編碼方法馍盟,導(dǎo)出文件為cer后綴于置。
對(duì)于openssl生成crt證書文件時(shí)-inform參數(shù)會(huì)有區(qū)別,如對(duì)DER編碼文件命令應(yīng)該是:
#? openssl? ?x509? ?-inform? DES? ?-in? ?test-der.cer? ?-text? ?-out? test-der.crt
其中test-der.cer是瀏覽器里導(dǎo)出的x.509證書文件贞岭,?test-der.crt是加密CA證書被curl所需加載驗(yàn)證的八毯。
如果導(dǎo)出用BASE64編碼導(dǎo)出的,則命令行應(yīng)該改為:
# openssl? x509? -inform? PEM? ?-in test-b64.cer? -text? -out? test-b64.crt
其中 -inform參數(shù)需要改為PEM瞄桨,來(lái)對(duì)應(yīng)編碼格式BASE64话速。
另外,X.509證書如果是三層以上的芯侥,即除了底層的URL外泊交,上面還有兩層以上的,則說明該證書是一個(gè)證書夾柱查,即便里面只有一個(gè)證書廓俭,用在curl時(shí)需作為--capath的參數(shù)值代入才能生效; 反之物赶,如果只有兩層的白指,即除了底層的URL外留晚,上面只有一層的酵紫,則說明該證書只是一個(gè)證書告嘲,用在curl里需作為--cacert里的參數(shù)值才能生效。
證書在curl里能被通過必須具備以下三個(gè)條件:
1奖地、被CA簽證過的證書橄唬;
2、期限有效的参歹;
3仰楚、URL能匹配請(qǐng)求。
其中第三個(gè)可以用過hosts添加ip-name對(duì)來(lái)實(shí)現(xiàn)欺騙犬庇,如果服務(wù)器的SSL證書屬于復(fù)制使用的話僧界。
用curl訪問https網(wǎng)址的命令:
#?curl? -k? ?https://www.xxxcom
其中-k的目的就是讓curl不對(duì)服務(wù)器的https證書認(rèn)證。
三臭挽、關(guān)于如何使用curl來(lái)訪問雙向認(rèn)證的https站點(diǎn)
1捂襟、首先,因?yàn)橐M(jìn)行客戶端認(rèn)證欢峰,你應(yīng)該具有了客戶端的個(gè)人證書(對(duì)于公司內(nèi)網(wǎng)葬荷,通常是由IT的管理員頒發(fā)給你的),只要你能夠順利的訪問雙向認(rèn)證的https站點(diǎn)纽帖,你就具有了個(gè)人證書宠漩,它藏在瀏覽器上。我們要做的工作懊直,只是把它從瀏覽器中導(dǎo)出來(lái)扒吁。
從IE瀏覽器導(dǎo)出來(lái)的格式,通常為.pfx格式室囊,從firefox導(dǎo)出來(lái)的格式通常為.p12格式瘦陈,其實(shí)pfx=p12,它們是同一個(gè)東西波俄,對(duì)于curl而言這種格式稱為PKCS#12文件晨逝。
2、把p12格式轉(zhuǎn)換為pem格式(假設(shè)你的p12文件名為:test.p12):
#?openssl? ?pkcs12? ?-in test.p12? ?-out? ?client.pem? -nokeys
//客戶端個(gè)人證書的公鑰
# openssl? pkcs12? -in? test.p12? -out??key.pem? -nocerts? -nodes
//客戶端個(gè)人證書的私鑰
你也可以轉(zhuǎn)換為公鑰與私鑰合二為一的文件:
#? ?openssl pkcs12? ?-in? ?testp12? ?-out all.pem? ?-nodes
在執(zhí)行過程中懦铺,可能需要你輸入導(dǎo)出證書時(shí)設(shè)置的密碼捉貌。
執(zhí)行成功后,我們就有了這些文件:client.pem—客戶端公鑰冬念,key.pem—客戶端私鑰趁窃,或者二合一的all.pem。
3.??執(zhí)行curl命令
使用client.pem+key.pem
#? curl? ?-k? --cert? ?client.pem? ?--key key.pem? ? https://www.xxx.com
使用all.pem
#?curl? -k? --cert all.pem? ?https://www.xxx.com
使用-k急前,是不對(duì)服務(wù)器的證書進(jìn)行檢查醒陆,這樣就不必關(guān)心服務(wù)器證書的導(dǎo)出問題。
四裆针、關(guān)于用curl訪問SSL加密網(wǎng)站問題
# curl -v -I https://www.baidu.com
# curl -v -I https://192.168.1.101:8443
curl默認(rèn)使用“捆綁的”證書頒發(fā)機(jī)構(gòu)(CA)和公鑰(CA證書)來(lái)執(zhí)行SSL的證書驗(yàn)證刨摩。
* Initializing NSS with certpath: sql:/etc/pki/nssdb
*? CAfile: /etc/pki/tls/certs/ca-bundle.crt
? CApath: none
如果是默認(rèn)值捆綁文件不夠用寺晌,您可以使用 --cacert 選項(xiàng) 指定備用文件。
如果此HTTPS服務(wù)器使用由CA表示的CA簽名的證書捆綁澡刹,證書驗(yàn)證可能因證書問題(可能已過期呻征,或名稱可能已過期,與URL中的域名不匹配)而失敗罢浇。
如果您想關(guān)閉curl對(duì)證書的驗(yàn)證陆赋,請(qǐng)使同-k(或--insecure)選項(xiàng)。
1. 使用 -k?(或--insecure)選項(xiàng)??
# curl -v -I https://192.168.1.101:8443 -k
2. 獲取目標(biāo)服務(wù)器的證書嚷闭,不使用?-k?(或--insecure)選項(xiàng)
# keytool? -printcert? -sslserver? 192.168.1.101:8443? -rfc? >? /etc/pki/ca-trust/source/anchors/test.crt
# cat? ?/etc/pki/ca-trust/source/anchors/test.crt
# update-ca-trust
# curl? -v? -I? https://192.168.1.101:8443
# curl? ?-v? ?-I? --cacert /etc/pki/ca-trust/source/anchors/test.crt? ?https://192.168.1.101:8443
五攒岛、參考
How To Use Curl with HTTPS Protocol and URLS?
https://www.poftut.com/how-to-use-curl-with-https-protocol-and-urls/
https connection using CURL from command line
https://stackoverflow.com/questions/10079707/https-connection-using-curl-from-command-line
SSL Certificate Verification
https://curl.haxx.se/docs/sslcerts.html
CA certificates extracted from Mozilla
https://curl.haxx.se/docs/caextract.html
關(guān)于curl訪問https的若干問題
https://blog.csdn.net/q553716434/article/details/39500467
Sending API requests using cURL
https://docs.oracle.com/cloud/latest/marketingcs_gs/OMCAB/Developers/GettingStarted/API%20requests/curl-requests.htm
利用curl進(jìn)行安全滲透測(cè)試
https://www.freebuf.com/column/164233.html
curl? --insecure option
https://curl.haxx.se/mail/archive-2017-08/0023.html
https://github.com/curl/curl/pull/1821
https://stackoverflow.com/questions/8520147/curl-insecure-option
HTTP協(xié)議之http狀態(tài)碼詳解
https://blog.csdn.net/hzw05103020/article/details/47276005