apt,curl,openssl之间的那点事

Curl 可以说是非常流行的一个客户端网络请求工具,充分理解了 Curl,相当于熟练掌握了 HTTP/HTTPS 协议(也包括其他的应用层协议,比如 FTP、IMAP 等等)。

一旦将 Curl 和 HTTPS 协议联系在一起,对于初学者来说,必然会思考以下几个问题:

  • Curl 是如何完成 HTTPS 协议交互的?
  • Curl 是基于 OpenSSL、Nss,还是其他密码学库实现的 HTTPS 功能?
  • 和浏览器一样,Curl 为校验证书,其依赖的根证书库位置在哪儿?
  • 使用包安装(apt或yum)和源代码安装 Curl 有什么区别?

在我写的书《深入浅出HTTPS:从原理到实战》也描述了 Curl 和 HTTPS 的交互,但由于各方面原因,讲解的不是特别深入,所以打算写几篇相关的文章解释这些问题,这篇文章主要基于 Ubuntu(14.4 版本) 的 apt 包安装工具讲解 Curl 和 HTTPS 相关知识,如何你对 apt 包安装工具不熟悉,也可以借此篇文章学习。

在 Ubuntu 下,为支持 HTTPS 协议,Curl 安装的时候默认使用的是 OpenSSL 密码库;在 CentOS 下,Curl 安装的时候默认使用的是 NSS 密码库。

首先看看 curl 依赖于哪些包,执行如下命令:

$ apt-cache depends  curl

输出如下:

curl
  依赖: libc6
  依赖: libcurl3
  依赖: zlib1g
  冲突: curl:i386

依赖最重要的包就是 libcurl3,执行如下命令,看看 libcurl3 依赖什么包:

$ apt-cache depends  libcurl3

输出如下:

libcurl3
  依赖: libc6
  依赖: libgssapi-krb5-2
  依赖: libidn11
  依赖: libldap-2.4-2
  依赖: librtmp0

并没有看到 OpenSSL 的影子,难道 libcurl3 没有包含 OpenSSL 相关库?

再仔细阅读 libcurl3 包的说明,执行下列命令:

$ apt-cache show libcurl3

结果见下图:

libcurl3

其中有两点重点关注:

  • Recommends: ca-certificates,推荐安装 ca-certificates 包,非常有用,后续我会专门描述。
  • SSL support is provided by OpenSSL,说明 libcurl3 的 SSL 功能确实由 OpenSSL 提供。

那么为什么从 libcurl3 包中看不到 OpenSSL 的影子呢?让我们拿出 ldd 大法,执行下列命令:

ldd /usr/bin/curl | grep ssl  

关键输出如下:

libssl.so.1.1 => /usr/lib/x86_64-linux-gnu/libssl.so.1.1 (0x00007fd25e60a000)

原来是 libcurl3 静态绑定了 libssl.so.1.1,这个包是 OpenSSL 提供的吗?通过两种方法验证。

(1)查看包依赖关系

$ apt-cache depends openssl 

输出:

openssl
  依赖: libc6
  依赖: libssl1.0.0
  建议: ca-certificates
  冲突: openssl:i386

可以看出 openssl 也依赖 libssl1.0.0。

同时 libssl1.0.0 也提供给 libcurl3,可以执行下列命令进行确认:

$ apt-cache rdepends  libssl1.0.0 | grep curl 
  libcurl3

(2)通过 curl-config

这个工具非常有用,官方介绍如下:

curl-config - Get information about a libcurl installation

也就是说,通过 apt 包安装 curl 虽然简单,但失去了解细节的乐趣(比如无法知晓编译了那些具体参数),而 curl-config 工具可以让你了解内幕。

如果机器没有该工具,可以使用下列命令安装:

$ apt-get install libcurl4-openssl-dev  
$ dpkg -L libcurl4-openssl-dev 

然后重点观察 apt 安装采用的 configure,执行如下命令:

$ 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 这个参数可以重点关注,curl 在校验服务器证书的时候,会使用该目录下的根证书库文件,在 Ubuntu 中,/etc/ssl/certs 是 OpenSSL 库配置的根证书库(是不是很想改为 NSS 可信任根证书库?后续文章我会描述)。

上述命令并没有 ssl 包相关信息,可以执行下列命令查看静态编译的库:

$ 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

如果你没有安装 Curl,执行一条命令就能完成(前提你安装了 OpenSSL,Ubuntu 默认会安装):

$ apt-get install curl

看看 Curl 安装后的信息,执行如下命令:

$ 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 

可见 curl 基于 libcurl/7.58.0 和 OpenSSL/1.1.0g。

然后再执行下 curl https 请求命令:

$ curl -v "https://www.baidu.com"

输出信息如下图:

curl -v

重点关注的细节是 curl 使用的可信任根证书库 CAfile: /etc/ssl/certs/ca-certificates.crt。后续会重点讲解 Curl 使用的根证书库。


我最近写了一本书《深入浅出HTTPS:从原理到实战》,欢迎去各大电商购买,也欢迎关注我的公众号(yudadanwx,虞大胆的叽叽喳喳),了解我最新的博文和本书。

公众号二维码

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容

  • 备注:本笔记所描述的问题的前提是机器上已安装成功git且通过配置ca证书支持以https方式获取远程仓库,如果使用...
    大诗兄_zl阅读 3,643评论 0 0
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,596评论 18 139
  • 一、什么是CURL? cURL 是一个利用URL语法规定来传输文件和数据的工具,支持很多协议,如HTTP、FTP、...
    伊Summer阅读 1,253评论 0 4
  • 她们走了好远好远,在地铁上不停的模拟着各种各样的情形,做着各种各样的准备工作。在上海地铁上形形色色的人之中,她们两...
    www妞儿阅读 273评论 0 1
  • 且慢!说这个话题前俺戴好头盔先,兄弟们下手轻点啊!头盔是借隔壁老王的,用完还得还呢。 去年底,在北京参加中国式众筹...
    阿渡SZ阅读 573评论 4 1