证书链和TLS Pinning

摘自 HTTPS 精读之 TLS 证书校验 

这篇讲证书校验,写得很好。

HTTPS的交互过程

1. 浏览器对服务器发送了一次请求,包含协议版本号、一个客户端生成的随机数(Client random),以及客户端支持的加密方法。

2. 服务器确认双方使用的加密方法,并给出数字证书、以及一个服务器生成的随机数(Server random)。

3. 浏览器确认数字证书有效,然后生成一个新的随机数(Premaster secret),并使用数字证书中的公钥,加密这个随机数,发给服务器。

4. 服务器使用自己的私钥,获取浏览器发来的随机数(即Premaster secret)。

5. 服务器和浏览器根据约定的加密方法,使用前面的三个随机数,生成"对话密钥"(session key),用来加密接下来的整个对话过程。


证书链(Certificate Chain)

X.509 除了规范证书的内容之外,还规范了如何获取 CRL 以及 Certificate Chain 的验证算法。X.509 规范由国际电信联盟(ITU)定义,RFC 5280 只是定义了 X.509 的用法。

文章最开始,我们访问 https://www.youzan.com 时,浏览器并非只拿到了一个证书,而是一个证书链:

证书「*.http://youzan.com」的 Issuer 就是它的父节点「Go Daddy Secure Certificate Authority」。因为 UA(浏览器或操作系统)中会预先内置一些权威 CA 签发的根证书(Root Certificate)或中间证书(Intermediate Certificate),例如上面的 「Go Daddy Secure Certificate Authority」和 「Go Daddy Root Certificate Authority」。

                                                                                      Chain of trust - from wikipedia

当获得证书链之后,我们就可以很轻松的往上回溯到被 UA 信任的证书,虽然 UA 内置的可能是中间证书(Intermediate Certificate),但是如果一个 End-Entity 证书即使回溯到跟证书(Root Certificate)也没有在 UA 的受信列表中找到,那么这个站点就会被标记为不安全,例如 12306 的主页被标记为 “Not Secure",因为它的根证书不被信任。

TLS Pinning

我们上面所分析的校验方式属于单向校验,仅仅是客户端对服务端证书进行校验,这种方式无法避免中间人攻击(Man-In-the-Middle-Attack)。我们日常开发中用 Charles 抓包时,Charles 就扮演了一个中间人的角色。抓包之前,我们需要在手机上安装一个 Charles 提供的根证书(Root Certificate),这个根证书加入到手机的 Trust Store 之后,它所签发的证书都会被 UA 认作可信。那么 Charles 就可以肆无忌惮地代表真正的 UA 与服务端建立连接,因为是单向认证,所以服务端并不会要求 Charles 提供证书。

但是实现双向校验的成本会比较高,因为 UA 端的证书管理比较复杂,例如证书的获取、有效期管理等等问题,而且需要用户手动添加到 Trust Store,这样也会降低用户体验。

既然双向认证的成本如此之高,那我们不妨利用 SSL Pinning 来解决证书认证被“劫持”的问题。

OkHttp 在 UA 端用一个类 Pin 来表示服务端的 TLS 证书。

证书的最终的表现形式是一个利用哈希算法(由 hashAlgorithm 字段表示)对证书公钥生成的哈希值(由 hash 字段表示),形式如下:

sha256/afwiKY3RxoMmLkuRW1l7QsPZTJPwDS2pdDROQjXw8ig=

斜杠之前的字符串是 hashAlgorithm,之后的字符串是 hash 值。

TLS 证书的 Extension 字段中有一个 SAN,用于配置域名,例如 「*.http://youzan.com」的证书中配置了两个域名 —— *.http://youzan.com 和 http://youzan.com,两者所匹配的域名是不同的,所以 Pin 用了一个 pattern 字段来表示两种模式。

我们知道,TLS 证书携带了端的公钥(Public Key),而这个公钥是 TLS 能够通过握手协商出“对称加密密钥”的关键,证书验证仅仅是为了证明当前证书确实是这个公钥的携带者,或者叫 Owner。所以我们只需要用一个 Pin 把服务端证书的公钥存储在本地,当得到证书链(Certificate Chain)之后,用 Pin 里的 hash 去匹配证书的公钥。

因为本地可以配置多个 Pin,因此 OkHttp 用了一个 CertificatePinner 来管理。

如此一来,在 TLS 握手过程中,校验证书那一步就可以保证服务端下发的证书是客户端想要的,从而避免了被中间人攻击(MIMA),因为本地没有存储中间人证书的 Pin,所以证书匹配会失败,握手也会失败,从而连接无法建立。

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