透视HTTP协议
罗剑锋(Chrono)
奇虎360技术专家,Nginx/OpenResty开源项目贡献者
立即订阅
6077 人已学习
课程目录
已完结 44 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词|To Be a HTTP Hero
免费
破冰篇 (7讲)
01 | 时势与英雄:HTTP的前世今生
02 | HTTP是什么?HTTP又不是什么?
03 | HTTP世界全览(上):与HTTP相关的各种概念
04 | HTTP世界全览(下):与HTTP相关的各种协议
05 | 常说的“四层”和“七层”到底是什么?“五层”“六层”哪去了?
06 | 域名里有哪些门道?
07 | 自己动手,搭建HTTP实验环境
基础篇 (7讲)
08 | 键入网址再按下回车,后面究竟发生了什么?
09 | HTTP报文是什么样子的?
10 | 应该如何理解请求方法?
11 | 你能写出正确的网址吗?
12 | 响应状态码该怎么用?
13 | HTTP有哪些特点?
14 | HTTP有哪些优点?又有哪些缺点?
进阶篇 (8讲)
15 | 海纳百川:HTTP的实体数据
16 | 把大象装进冰箱:HTTP传输大文件的方法
17 | 排队也要讲效率:HTTP的连接管理
18 | 四通八达:HTTP的重定向和跳转
19 | 让我知道你是谁:HTTP的Cookie机制
20 | 生鲜速递:HTTP的缓存控制
21 | 良心中间商:HTTP的代理服务
22 | 冷链周转:HTTP的缓存代理
安全篇 (7讲)
23 | HTTPS是什么?SSL/TLS又是什么?
24 | 固若金汤的根本(上):对称加密与非对称加密
25 | 固若金汤的根本(下):数字签名与证书
26 | 信任始于握手:TLS1.2连接过程解析
27 | 更好更快的握手:TLS1.3特性解析
28 | 连接太慢该怎么办:HTTPS的优化
29 | 我应该迁移到HTTPS吗?
飞翔篇 (4讲)
30 | 时代之风(上):HTTP/2特性概览
31 | 时代之风(下):HTTP/2内核剖析
32 | 未来之路:HTTP/3展望
33 | 我应该迁移到HTTP/2吗?
探索篇 (5讲)
34 | Nginx:高性能的Web服务器
35 | OpenResty:更灵活的Web服务器
36 | WAF:保护我们的网络服务
37 | CDN:加速我们的网络服务
38 | WebSocket:沙盒里的TCP
总结篇 (2讲)
39 | HTTP性能优化面面观(上)
40 | HTTP性能优化面面观(下)
答疑篇 (2讲)
41 | Linux/Mac实验环境搭建与URI查询参数
42 | DHE/ECDHE算法的原理
结束语 (1讲)
结束语 | 做兴趣使然的Hero
透视HTTP协议
登录|注册

25 | 固若金汤的根本(下):数字签名与证书

Chrono 2019-07-24
上一讲中我们学习了对称加密和非对称加密,以及两者结合起来的混合加密,实现了机密性。
但仅有机密性,离安全还差的很远。
黑客虽然拿不到会话密钥,无法破解密文,但可以通过窃听收集到足够多的密文,再尝试着修改、重组后发给网站。因为没有完整性保证,服务器只能“照单全收”,然后他就可以通过服务器的响应获取进一步的线索,最终就会破解出明文。
另外,黑客也可以伪造身份发布公钥。如果你拿到了假的公钥,混合加密就完全失效了。你以为自己是在和“某宝”通信,实际上网线的另一端却是黑客,银行卡号、密码等敏感信息就在“安全”的通信过程中被窃取了。
所以,在机密性的基础上还必须加上完整性、身份认证等特性,才能实现真正的安全。

摘要算法

实现完整性的手段主要是摘要算法(Digest Algorithm),也就是常说的散列函数、哈希函数(Hash Function)。
你可以把摘要算法近似地理解成一种特殊的压缩算法,它能够把任意长度的数据“压缩”成固定长度、而且独一无二的“摘要”字符串,就好像是给这段数据生成了一个数字“指纹”。
换一个角度,也可以把摘要算法理解成特殊的“单向”加密算法,它只有算法,没有密钥,加密后的数据无法解密,不能从摘要逆推出原文。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《透视HTTP协议》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(30)

  • Geek_steven_wang
    保密性:靠混合加密解决,非对称加密实现对称加密秘钥传递,对称加密实现内容加密。
    完整性:靠摘要算法解决。
    身份认证:靠数字证书解决,数字证书因为CA机构的信任变成一个完整信任链条,从而实现通过数字证书证明了对方真实身份,但注意身份真实也可能是挂羊头卖狗肉,是一个坏人,所以,有了CRL、OCSP,还有终止信任。
    不可否认:靠数字签名解决,内容摘要算法得到摘要,私钥加密摘要,对方使用对应公钥解密,得到摘要,再和自己得到的服务器提供的原文摘要对比,一致说明这个内容就是原服务器提供的,由证书说明了服务器的身份。

    关于证书验证:
    服务器返回的是证书链(不包括根证书,根证书预置在浏览器中),然后浏览器就可以使用信任的根证书(根公钥)解析证书链的根证书得到一级证书的公钥+摘要验签,然后拿一级证书的公钥解密一级证书拿到二级证书的公钥和摘要验签,再然后拿二级证书的公钥解密二级证书得到服务器的公钥和摘要验签,验证过程就结束了。

    作者回复: 说的非常好。

    2019-08-24
    9
  • 放开那个猴子
    看完老师的文章有点迷惑,主要是没搞清完整的流程,又去找资料看了一下,说下自己的理解,老师看看对不。

    数字签名和数字证书只用于TSL/SSL的握手阶段,主要是保证服务器的公钥能够正确地传给浏览器(不被中间人伪装发送假的公钥)

    具体流程大概是:
    1、服务器去CA机构申请证书,证书中包含了要发给客户端的公钥、签发者、到期时间等等信息。如果这样简单地把证书发给浏览器,中间人可以轻松地修改成自己的公钥,之后的通信就是不安全的了。于是需要一定的加密手段,这里的做法就是使用数字签名:将证书的信息利用摘要算法计算出摘要之后,用CA的秘钥进行加密,生成数字签名。
    2、服务器将数字证书和数字签名一起发给浏览器,因为有数字签名,所以数字证书无法被中间人做修改(修改之后生成的数字签名无法被CA公钥解密),浏览器拿到数字证书之后,去本地的信任机构中查询到对应的机构,利用其公钥解密数字签名,验证证书是否有被修改过。这一步就保证了浏览器获取到的公钥一定是正确的。
    3、公钥正确地传给浏览器之后,接着就是协商对称加密的密钥,然后通信等等..

    参考:
    http://www.ruanyifeng.com/blog/2011/08/what_is_a_digital_signature.html
    https://www.zhihu.com/question/52493697

    作者回复: 态度很认真,值得表扬。

    有一点小错误,数字签名的防窜改不是因为“修改之后生成的数字签名无法被CA公钥解密”,而是修改后的摘要变动了,与签名里解密出的原始摘要不匹配,所以能够发现原文被窜改。

    另外,你说的这些是目前流行的PKI体系,但公钥私钥本身并不一定要用证书,它们本身属于密码学。

    2019-07-24
    1
    6
  • 郭凯强
    问题1. 非加密算法需要公开公钥从而让客户端能解密。如果用对称加密,加密秘钥公开,就达不到加密效果了
    问题2. 客户端发现当前网站的证书是二级CA,在可信任签发机构中找不到,就会去拿二级CA的数字证书的签发机构去做检查,发现它是一级CA,也不在可信任签发机构中,再找一级CA的数字证书的签发机构,发现是受信任的ROOT CA,至此完成验证。如果到最后一层CA都不受信任,就会警告用户

    作者回复: √

    2019-07-24
    1
    6
  • Leon📷
    重放和篡改的问题没有提,黑客是解不开秘文,但是可以重复发送,需要时间戳和随机数再合起来做一个不可逆的签名,服务端收到重复的就丢弃

    作者回复: 感谢补充,这个就是nonce了。

    2019-07-24
    3
  • 彩色的沙漠
    对于第二个问题证书链验证的过程,有些不理解的地方,请老师指教,您在文章说“操作系统和浏览器都内置了各大 CA 的根证书,上网的时候只要服务器发过来它的证书,就可以验证证书里的签名,顺着证书链(Certificate Chain)一层层地验,直到找到根证书”,服务器只返回了他的证书(假如返回的是二级证书),浏览器内置的是根证书(根公钥)使用根公钥只能解密根机构签名的证书,无法解密二级证书,使用一级证书(公钥)才能解密二级证。那么浏览器是怎么自下向上层层解析到根证书?我的理解的是服务器返回的是证书链,然后浏览器就可以使用信任的根证书(根公钥)解析证书链的根证书得到一级证书的公钥+摘要验签,然后拿一级证书的公钥解密一级证书拿到二级证书的公钥和摘要验签,再然后拿二级证书的公钥解密二级证书得到服务器的公钥和摘要验签,验证过程就结束了。谢谢!

    作者回复: 你理解的很对,服务器会在握手的时候返回整个证书链,但通常为了节约数据量,不会包含最终的根证书,因为根证书通常已经在浏览器或者操作系统里内置了。

    2019-07-24
    2
    3
  • 极客时间
    到这里完全爆炸了

    作者回复: 哪里不明白可以随时问。

    2019-07-24
    1
    2
  • Neo
    老师好,有两个问题:
    1. 在有正向代理服务器的时候TLS是如何工作的?
    您在代理服务器那个章节提到,代理服务器会更改http header的信息,如果设计的更改报文内容,那么完整性就破坏了。所以,我猜测,又正向代理服务器的情况下,整个通讯被分割成两段,一段是客户端到代理服务器的https通讯,另外一段是代理服务器到服务器的https的通讯过程。不知道是否理解正确?
    2. 能否解释一下TLS里面的client certificate (two-way auth)的工作方式
    我猜测是在握手协商的过程中,服务器要求客户端发送客户端证书过来,进行身份验证。但具体是怎么协商的,客户端又是怎么保住自己发送的证书安全到达服务器端的,还没搞清楚。

    谢谢老师

    作者回复:
    1.是的,代理作为中间人,对客户端和服务器分别使用TLS通信。

    2.客户端证书的用法在后面有讲,其实并不难,因为证书本身是被ca签名的,可以防窜改,直接发就行。

    2019-11-18
    1
  • 蓝配鸡
    为什么公钥能够建立信任链,用对称加密算法里的对称密钥行不行呢?
    所谓建立信任链, 是指发送方相信公钥确实是接收方的。因为有CA的信任链和最后根CA的背书。
    用对称密钥行不行呢?
    用对称密钥来确认公钥的真实性,就好像是街头对暗号。 A:枯藤老树昏鸭 B:穿条秋裤回家。 这样做确实可以确认“你就是你”,可问题是如何交换密钥呢? 问题就又绕回到了非对称密钥了。

    假设有一个三级的证书体系(Root CA=> 一级 CA=> 二级 CA),你能详细解释一下证书信任链的验证过程吗?
    没有具体实战过,我猜测如下:
    二级CA交给了浏览器,CA说:“我是某宝,这是我的公钥,这个一级CA给我背书了, 你要相信我!”
    浏览器再去确认这个一级CA可不可信,一级CA说:“我是公安局,这是我的公钥,这个根CA给我背书了, 你要相信我!”
    浏览器再去确认这个根CA可不可信,根CA说:“我是上帝我说了算,你爱信不信”。浏览器也很无奈啊。。。只能信了。

    作者回复: 学习进度很快啊,回答的也很形象生动。

    2019-10-30
    1
  • 业余草
    如果画一个完整的流程图就更好了

    作者回复: 后面两讲会对tls的握手有详细的流程图,请参考。

    2019-08-19
    1
  • 一坛幽梦
    老师,在nginx中一般都会配置由ca机构签发的证书(ssl_certificate)和私钥(ssl_certificate_key);
    问题一:那个证书是由ca机构的私钥进行加密过的,然后在客户端访问的时候,通过浏览器中内置的ca的公钥进行解密,这样理解对吗?
    问题二:nginx中配置的私钥(ssl_certificate_key)又是什么用途呢?

    作者回复:
    1.基本正确,浏览器用的实际上是证书里的公钥,不是裸公钥。

    2.Nginx中配置的私钥就是用来证明服务器身份的私钥,也就是服务器证书对应的私钥,用来在tls握手时验证身份。

    3.可参考后面两讲,看看证书和私钥是怎么起作用的。

    2019-08-17
    1
  • 一步
    MD5(Message-Digest 5)、SHA-1(Secure Hash Algorithm 1),两个摘要算法,能够生成 16 字节和 20 字节长度的数字摘要

    为什么实验环境中实际 MD5算法生成的 32字节长度的呢?(英文中一个字母占一个字节)
    sha1 算法生成的 是 40个字节长度的?
    还有 sha-2 的算法,生成的长度都是扩大了2倍

    作者回复: md5、sha1的摘要是二进制数据的16字节、20字节,不能直接看,所以做了hex编码,也就是一个字节变成了两个字符,所以扩大了两倍。

    2019-07-27
    1
  • 大小兵
    老师我有两个疑问:
    1. 用自己的私钥对摘要进行加密生成数字签名,这个数字签名需要经过公钥加密后发送给对方吗?
    2. 是否在每次发送消息时都要进行生成摘要和生成数字签名这两个过程?

    作者回复: 1.只要私钥加密后就可以了,不需要公钥参与,私钥加密的结果就是签名。

    2.如果每次都要对消息签名就需要做这两步,先摘要再加密,也就是数字签名。

    3.但私钥运算很慢,实际上不会这样做,而是在握手的时候签名验签,接下来会讲tls握手,它实现了完善的密钥交换过程。

    2019-07-24
    1
  • Geek_54edc1
    1、因为对称加密时,双方要协商密钥,密钥在传输过程中极易被窃取,而非对称加密方式,双方只要协商公钥就行了,私钥都是自己保存的

    作者回复: √

    2019-07-24
    1
  • 使用非对称加密算法RSA交换对称算法AES的密钥部分有疑问:
    1,这个交换动作是谁发起的?
    2,需要双方都要确认吗?
    3,其中非对称加密算法RSA的私钥保存部分没看懂,网站的私钥保存在服务器端,安全;那么用户的私钥呢?是保存在ca证书颁发机构吗?还是保存在浏览器端?

    另外,如果网站用户使用黑客手段修改客户端内存数据,然后提交服务器,这种情况https有招吗?

    作者回复: 1/2可以看接下来的tls握手,如何交换如何确认就要使用一种双方都认可的协议。

    3.私钥需要自己保管,方法有很多,比如u盾(特殊的usb设备),或者直接就是一个文本文件,想怎么存就怎么存。

    4.https只保证通信链路的安全,在这之外它是无能为力的。

    2019-07-24
    1
  • -W.LI-
    对称加密就一个秘钥,CA有你的私钥如果ca被黑了黑客可以随便怎么玩。用公钥的话,CA被黑了,黑客没法拿到私钥。只能伪装用户没法伪装服务器。不晓得理解的对不对。
    第二个应该从下往上一级一级严重吧。三级验证不通过就不用验证二级了。

    作者回复: 1的理解有点小问题,信任链里其实不一定非要有ca,如果只是在一个很小的范围内,没有证书只用公钥也可以建立信任关系。

    关键是对称密钥没有私密性,不能实现身份认证。

    2019-07-24
    1
  • 听雨
    老师,申请证书时,也是走这样一个流程吗:先建立TSL连接,然后发送申请资料,CA返回证书这样子

    作者回复: 证书申请是完全另外一个流程了,不是https连接这么简单,可以参考一下rfc8555。

    2019-10-30
  • qiezitx
    保持系统学习~

    这里总结一下:
    机密性:混合加密。对称加密(常用AES和ChaCha20)+ 非对称加密(常用RSA和ECC)
    完整性:摘要算法(即哈希算法,如MD5、SHA1,但TLS常用SHA2)。还需基于机密性才能保证真正的完整性,使用会话密钥再加密摘要形成HMAC。
    不可否认:数字签名。私钥签名公钥验签,能验签说明肯定是你发的,为了减少计算量,私钥对原文的摘要加密。思考:不可否认特性使用非对称加密,通讯建立后都使用对称加密,那这个特性有使用场景么?
    身份认证:数字证书。其实数字签名利用私钥的唯一性就实现了身份认证,但毕竟要公钥验签,得把公钥分发出去,怎么保证公钥的可信呢?
    这里复杂的地方,是涉及多对公钥私钥。
    首先数字证书是对公钥的签名,还打包了一些其他信息,然后每级CA有自己的私钥公钥,私钥用来签名申请者或者低级CA的公钥,自己的公钥交给高级CA签名,最后到Root CA会有自签名证书,自己证明自己。
    一般操作系统和浏览器会预装各大CA的根证书,验证过程反过来,首先服务器将自己的证书发过来,里面包含公钥,但是否可信呢?然后一级一级向下验证公钥的可信,最后验证到服务器公钥的可信。
    ps:看评论,服务端返回的是证书链,不包含根证书。后面验证一下。

    作业:
    1、要认证两端,关键要利用私钥的唯一性,对称加密不行。
    2、如上描述。

    作者回复: 服务器的证书链也可以包含根证书,不含根证书是为了效率,少发点数据。

    2019-10-22
  • - shadow -
    老师你好,对于Root CA怎么证明自己这个地方理解不了。 什么叫做“你必须相信”,这里的你指的是什么?

    作者回复: 根证书是自签名证书,也就是自己证明自己,是信任的起点,所以作为用户,也就是“你”,就必须信任它,否则就没有从它开始的整个证书链。

    所谓自签名,就是用证书里的公钥来证明证书里的公钥,自己证明自己。

    2019-10-16
  • L
    想请教一个问题,最后关于CA这部分,我是否可以理解成服务器的公钥在CA处也有一份,浏览器端拿到公约以后就去CA处校验一下是否正确。
    那么怎么才能保证,浏览器去的CA是正确的呢?怎么保证这中间没有走到其他的地方去了呢?
    也就是说,假如我在发起一次请求的时候被黑客拦截了,返回了一个假的证书,我使用这个证书去CA去验证的时候,请求又被拦截了,告诉了我假的证书是真的证书,不会出现这种情况吗?

    作者回复: ca不保存任何东西,只是对公钥做签名,生成证书。

    因为证书用的是ca私钥签名,而这个私钥只有ca持有,所以只要验证了证书里的签名,就可以保证证书是正确的,没有被窜改。

    ca严格保管私钥,所以黑客无法获取,也就无法冒充。

    你说的最后一种情况,只有黑客破解了根证书的时候才能出现。

    2019-08-29
  • kmmshmily
    老师,您好,如何在系统证书存储区安装根证书呢,这个系统是浏览器,还是操作系统呢

    作者回复: 在Windows里比较简单,双击证书就会提示安装,在对话框里选择安装的区域就可以了。

    通常都说的是安装到操作系统里,好像很少有说安装到浏览器里的。

    2019-08-21
    1
收起评论
30
返回
顶部