Curl 可以說(shuō)是非常流行的一個(gè)客戶端網(wǎng)絡(luò)請(qǐng)求工具,充分理解了 Curl抖甘,相當(dāng)于熟練掌握了 HTTP/HTTPS 協(xié)議(也包括其他的應(yīng)用層協(xié)議热鞍,比如 FTP、IMAP 等等)衔彻。
一旦將 Curl 和 HTTPS 協(xié)議聯(lián)系在一起,對(duì)于初學(xué)者來(lái)說(shuō)偷办,必然會(huì)思考以下幾個(gè)問(wèn)題:
- Curl 是如何完成 HTTPS 協(xié)議交互的艰额?
- Curl 是基于 OpenSSL、Nss椒涯,還是其他密碼學(xué)庫(kù)實(shí)現(xiàn)的 HTTPS 功能柄沮?
- 和瀏覽器一樣,Curl 為校驗(yàn)證書(shū)废岂,其依賴(lài)的根證書(shū)庫(kù)位置在哪兒祖搓?
- 使用包安裝(apt或yum)和源代碼安裝 Curl 有什么區(qū)別?
在我寫(xiě)的書(shū)《深入淺出HTTPS:從原理到實(shí)戰(zhàn)》也描述了 Curl 和 HTTPS 的交互湖苞,但由于各方面原因拯欧,講解的不是特別深入,所以打算寫(xiě)幾篇相關(guān)的文章解釋這些問(wèn)題财骨,這篇文章主要基于 Ubuntu(14.4 版本) 的 apt 包安裝工具講解 Curl 和 HTTPS 相關(guān)知識(shí)镐作,如何你對(duì) apt 包安裝工具不熟悉藏姐,也可以借此篇文章學(xué)習(xí)。
在 Ubuntu 下该贾,為支持 HTTPS 協(xié)議羔杨,Curl 安裝的時(shí)候默認(rèn)使用的是 OpenSSL 密碼庫(kù);在 CentOS 下杨蛋,Curl 安裝的時(shí)候默認(rèn)使用的是 NSS 密碼庫(kù)兜材。
首先看看 curl 依賴(lài)于哪些包,執(zhí)行如下命令:
$ apt-cache depends curl
輸出如下:
curl
依賴(lài): libc6
依賴(lài): libcurl3
依賴(lài): zlib1g
沖突: curl:i386
依賴(lài)最重要的包就是 libcurl3逞力,執(zhí)行如下命令护姆,看看 libcurl3 依賴(lài)什么包:
$ apt-cache depends libcurl3
輸出如下:
libcurl3
依賴(lài): libc6
依賴(lài): libgssapi-krb5-2
依賴(lài): libidn11
依賴(lài): libldap-2.4-2
依賴(lài): librtmp0
并沒(méi)有看到 OpenSSL 的影子,難道 libcurl3 沒(méi)有包含 OpenSSL 相關(guān)庫(kù)掏击?
再仔細(xì)閱讀 libcurl3 包的說(shuō)明卵皂,執(zhí)行下列命令:
$ apt-cache show libcurl3
結(jié)果見(jiàn)下圖:
其中有兩點(diǎn)重點(diǎn)關(guān)注:
- Recommends: ca-certificates,推薦安裝 ca-certificates 包砚亭,非常有用灯变,后續(xù)我會(huì)專(zhuān)門(mén)描述。
- SSL support is provided by OpenSSL捅膘,說(shuō)明 libcurl3 的 SSL 功能確實(shí)由 OpenSSL 提供添祸。
那么為什么從 libcurl3 包中看不到 OpenSSL 的影子呢?讓我們拿出 ldd 大法寻仗,執(zhí)行下列命令:
ldd /usr/bin/curl | grep ssl
關(guān)鍵輸出如下:
libssl.so.1.1 => /usr/lib/x86_64-linux-gnu/libssl.so.1.1 (0x00007fd25e60a000)
原來(lái)是 libcurl3 靜態(tài)綁定了 libssl.so.1.1刃泌,這個(gè)包是 OpenSSL 提供的嗎?通過(guò)兩種方法驗(yàn)證署尤。
(1)查看包依賴(lài)關(guān)系
$ apt-cache depends openssl
輸出:
openssl
依賴(lài): libc6
依賴(lài): libssl1.0.0
建議: ca-certificates
沖突: openssl:i386
可以看出 openssl 也依賴(lài) libssl1.0.0耙替。
同時(shí) libssl1.0.0 也提供給 libcurl3,可以執(zhí)行下列命令進(jìn)行確認(rèn):
$ apt-cache rdepends libssl1.0.0 | grep curl
libcurl3
(2)通過(guò) curl-config
這個(gè)工具非常有用曹体,官方介紹如下:
curl-config - Get information about a libcurl installation
也就是說(shuō)俗扇,通過(guò) apt 包安裝 curl 雖然簡(jiǎn)單,但失去了解細(xì)節(jié)的樂(lè)趣(比如無(wú)法知曉編譯了那些具體參數(shù))箕别,而 curl-config 工具可以讓你了解內(nèi)幕铜幽。
如果機(jī)器沒(méi)有該工具,可以使用下列命令安裝:
$ apt-get install libcurl4-openssl-dev
$ dpkg -L libcurl4-openssl-dev
然后重點(diǎn)觀察 apt 安裝采用的 configure串稀,執(zhí)行如下命令:
$ curl-config --configure
輸出如下:
'--build=x86_64-linux-gnu' '--prefix=/usr' '--includedir=/usr/include' '--mandir=/usr/share/man' '--infodir=/usr/share/info' '--sysconfdir=/etc' '--localstatedir=/var' '--libdir=/usr/lib/x86_64-linux-gnu' '--libexecdir=/usr/lib/x86_64-linux-gnu' '--disable-maintainer-mode' '--disable-dependency-tracking' '--disable-symbol-hiding' '--enable-versioned-symbols' '--enable-threaded-resolver' '--with-lber-lib=lber' '--with-gssapi=/usr' '--with-ca-path=/etc/ssl/certs' 'build_alias=x86_64-linux-gnu' 'CFLAGS=-g -O2 -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security' 'LDFLAGS=-Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,--as-needed' 'CPPFLAGS=-D_FORTIFY_SOURCE=2'
--with-ca-path 這個(gè)參數(shù)可以重點(diǎn)關(guān)注除抛,curl 在校驗(yàn)服務(wù)器證書(shū)的時(shí)候,會(huì)使用該目錄下的根證書(shū)庫(kù)文件母截,在 Ubuntu 中到忽,/etc/ssl/certs 是 OpenSSL 庫(kù)配置的根證書(shū)庫(kù)(是不是很想改為 NSS 可信任根證書(shū)庫(kù)?后續(xù)文章我會(huì)描述)微酬。
上述命令并沒(méi)有 ssl 包相關(guān)信息绘趋,可以執(zhí)行下列命令查看靜態(tài)編譯的庫(kù):
$ curl-config --static-libs
輸出如下:
/usr/lib/x86_64-linux-gnu/libcurl.a -Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,--as-needed -lidn -lrtmp -lssl -lcrypto -lssl -lcrypto -Wl,-Bsymbolic-functions -Wl,-z,relro -lgssapi_krb5 -lkrb5 -lk5crypto -lcom_err -llber -llber -lldap -lz
如果你沒(méi)有安裝 Curl颤陶,執(zhí)行一條命令就能完成(前提你安裝了 OpenSSL,Ubuntu 默認(rèn)會(huì)安裝):
$ apt-get install curl
看看 Curl 安裝后的信息陷遮,執(zhí)行如下命令:
$ curl -V
輸出信息如下:
curl 7.58.0 (x86_64-pc-linux-gnu) libcurl/7.58.0 OpenSSL/1.1.0g zlib/1.2.8 nghttp2/1.31.0-DEV
Release-Date: 2018-01-24
Protocols: dict file ftp ftps gopher http https imap imaps pop3 pop3s rtsp smb smbs smtp smtps telnet tftp
Features: AsynchDNS IPv6 Largefile NTLM NTLM_WB SSL libz TLS-SRP HTTP2 UnixSockets HTTPS-proxy
可見(jiàn) curl 基于 libcurl/7.58.0 和 OpenSSL/1.1.0g滓走。
然后再執(zhí)行下 curl https 請(qǐng)求命令:
$ curl -v "https://www.baidu.com"
輸出信息如下圖:
重點(diǎn)關(guān)注的細(xì)節(jié)是 curl 使用的可信任根證書(shū)庫(kù) CAfile: /etc/ssl/certs/ca-certificates.crt。后續(xù)會(huì)重點(diǎn)講解 Curl 使用的根證書(shū)庫(kù)帽馋。
我最近寫(xiě)了一本書(shū)《深入淺出HTTPS:從原理到實(shí)戰(zhàn)》搅方,歡迎去各大電商購(gòu)買(mǎi),也歡迎關(guān)注我的公眾號(hào)(yudadanwx绽族,虞大膽的嘰嘰喳喳)姨涡,了解我最新的博文和本書(shū)。