apt晤锹,curl摩幔,openssl之間的那點(diǎn)事

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)下圖:

libcurl3

其中有兩點(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"

輸出信息如下圖:

curl -v

重點(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ū)。

公眾號(hào)二維碼

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末吧慢,一起剝皮案震驚了整個(gè)濱河市涛漂,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌检诗,老刑警劉巖匈仗,帶你破解...
    沈念sama閱讀 212,383評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異逢慌,居然都是意外死亡悠轩,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)攻泼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)火架,“玉大人,你說(shuō)我怎么就攤上這事忙菠『渭Γ” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,852評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵只搁,是天一觀的道長(zhǎng)音比。 經(jīng)常有香客問(wèn)我,道長(zhǎng)氢惋,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,621評(píng)論 1 284
  • 正文 為了忘掉前任稽犁,我火速辦了婚禮焰望,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘已亥。我一直安慰自己熊赖,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,741評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布虑椎。 她就那樣靜靜地躺著震鹉,像睡著了一般俱笛。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上传趾,一...
    開(kāi)封第一講書(shū)人閱讀 49,929評(píng)論 1 290
  • 那天迎膜,我揣著相機(jī)與錄音,去河邊找鬼浆兰。 笑死磕仅,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的簸呈。 我是一名探鬼主播榕订,決...
    沈念sama閱讀 39,076評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼蜕便!你這毒婦竟也來(lái)了劫恒?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,803評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤轿腺,失蹤者是張志新(化名)和其女友劉穎两嘴,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體吃溅,經(jīng)...
    沈念sama閱讀 44,265評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡溶诞,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,582評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了决侈。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片螺垢。...
    茶點(diǎn)故事閱讀 38,716評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖赖歌,靈堂內(nèi)的尸體忽然破棺而出枉圃,到底是詐尸還是另有隱情,我是刑警寧澤庐冯,帶...
    沈念sama閱讀 34,395評(píng)論 4 333
  • 正文 年R本政府宣布孽亲,位于F島的核電站,受9級(jí)特大地震影響展父,放射性物質(zhì)發(fā)生泄漏返劲。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,039評(píng)論 3 316
  • 文/蒙蒙 一栖茉、第九天 我趴在偏房一處隱蔽的房頂上張望篮绿。 院中可真熱鬧,春花似錦吕漂、人聲如沸亲配。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,798評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)吼虎。三九已至犬钢,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間思灰,已是汗流浹背玷犹。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,027評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留官辈,地道東北人箱舞。 一個(gè)月前我還...
    沈念sama閱讀 46,488評(píng)論 2 361
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像拳亿,于是被迫代替她去往敵國(guó)和親晴股。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,612評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容

  • 備注:本筆記所描述的問(wèn)題的前提是機(jī)器上已安裝成功git且通過(guò)配置ca證書(shū)支持以https方式獲取遠(yuǎn)程倉(cāng)庫(kù)肺魁,如果使用...
    大詩(shī)兄_zl閱讀 3,654評(píng)論 0 0
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理电湘,服務(wù)發(fā)現(xiàn),斷路器鹅经,智...
    卡卡羅2017閱讀 134,637評(píng)論 18 139
  • 一夺蛇、什么是CURL赵抢? cURL 是一個(gè)利用URL語(yǔ)法規(guī)定來(lái)傳輸文件和數(shù)據(jù)的工具善延,支持很多協(xié)議腮出,如HTTP、FTP蹦误、...
    伊Summer閱讀 1,262評(píng)論 0 4
  • 她們走了好遠(yuǎn)好遠(yuǎn)强胰,在地鐵上不停的模擬著各種各樣的情形舱沧,做著各種各樣的準(zhǔn)備工作。在上海地鐵上形形色色的人之中偶洋,她們兩...
    www妞兒閱讀 276評(píng)論 0 1
  • 且慢玄窝!說(shuō)這個(gè)話題前俺戴好頭盔先牵寺,兄弟們下手輕點(diǎn)啊恩脂!頭盔是借隔壁老王的缸剪,用完還得還呢。 去年底东亦,在北京參加中國(guó)式眾籌...
    阿渡SZ閱讀 575評(píng)論 4 1