http协议发展历史
说到网络协议,就不得不提HTTP(HyperText Tranfer Protocol)。这个在上世纪90年代慢慢确立成为标准的超文本传输协议,极大推动了互联网的发展进程。每天都有无数消息通过该协议传递到世界各个角落,然而在网络设施高度发展的今天,通过暴露出非常多的安全问题。ISP的流量劫持,各种网络攻击层出不穷,因此就需要针对原来的协议做一层安全的封装,从而诞生了https。https包括了非常多的内容,涉及网络协议,密码学等众多领域。
依据网络协议的分层设计,为了为应用层的http提供安全防护,同时利用TCP/IP的传输协议,那么将新的安全层(这里指的是TLS)放到其中间就是很自然的事了。事实也是这样,来看看最新的设计图:

从图上看HTTPS的内容也非常明确,就是HTTP + TLS。现在可以简单介绍下这个TLS了。TLS全称是Transport Layer Security, 读者可能还听说过另一个叫SSL(Secure Sockets Layer)的协议,那么这两者的关系其实是TLS是SSL的升级版。所以很多就把安全层直接写成了SSL/TLS。而这个协议设计时的目标也就奠定了整个安全层的核心:
- 数据是机密的:通信两端传输的数据应该是安全的,不可伪造和篡改的;
- 互操作性:TLS/SSL协议是标准的,任何开发者基于RFC设计规范都可以实现该协议;
- 可扩展性:密码学算法是不断迭代的,因此协议允许动态的引入新的算法。由于通信体之间环境是不一样的,协议允许双方协商出都支持的密码学算法。
- 效率:解决方案必须是高效的,TLS协议涉及了很多密码学的运算,增加了通信延时和机器负载。
现在想想还是非常合理的,而且这几个特性也其实是实际所有架构的标准设计规范,高可扩展,高效...。既然说了基于TLS协议实现都可以用,那么现实有哪些实现的?大名鼎鼎的OpenSSL, 小众的LibreSSL,BoringSSL等都是。你可以将其理解为一套工具,浏览器也好,服务器也好,其他终端也好,都是基于这种实现来对数据进行加密,封装,通信。
HTTPS 的密码学基础
实际的TLS设计非常多的密码学工具。对称加密,非对称加密,RSA,椭圆曲线EC,DH算法, SHA....随着密码学的不断发展,有些十几年前还特别安全的算法现在已经被轻松破解了,同时又有更多厉害的算法被引入,是一个不断变化的过程,因此作为协议能够允许扩展实在是太明智了。下面就来看看主流设计的密码学算法有哪些:
-
随机数:这是被广泛使用的工具,说它是所有加密的基石一点也不过分。根据真伪可以分为真随机数,伪随机数生成器,密码学伪随机数生成器。
image.png
伪随机数生成算法被应用到包括块密码算法,摘要函数 ,流密码算法等等,而常见的伪随机算法包括Blum Blum Shub, Mersenne Twister(马特赛特旋转演算法), Linear congruential generator 线性同余法。
-
Hash算法:包括前几年比较火的md5和SHA系列算法,作为效验数据完整性的工具。但是md5由于只有128位,且违反了密码学的强抗碰撞特性,因此慢慢退出历史舞台。
另外之所以先提随机数和hash,是因为大部分的算法都将这两种数作为加密基元(Cryptographic Primitives) -
对称加密算法: 形象的比喻就是双方都通过同一把钥匙开解锁密文,谁要是能拿到这把钥匙,那么就等于密码被破解了。
image.png
常见的分类是按照加密的方式:分为块密码(例如AES)和流密码。前者按照密钥块长度的倍数操作加密序列,后者通过某种密码规范按位操作明文,典型的操作如XOR异或操作。
-
消息验证码MAC(Message Authentication Code):mac的目的倒不是加密明文,而是确保数据在传输过程中没有被篡改过。那怎么实现么,可以双方共同维护一个密码,通过一个mac函数计算出一个mac值来判断,mac值随数据一起传输,如果发现本地计算的mac值和带过来的mac值一致,就证明是特定的人发送的。
image.png
mac算法有两种形式,分别是CBC-MAC算法和HMAC算法。前者是对应着块密码的CBC,后者对应着Hash。
-
密钥协商算法: 典型的有RSA和DH(Diffie-Hellman)算法, 属于非对称加密算法。通过一个例子来看看
- 客户端初始化链接服务器端,服务器发送RSA密钥对的公钥给客户端
- 客户端生成一个随机值,这个值必须是随机的,不能被攻击者猜出,这个值就是会话密钥
- 客户端使用服务器RSA密钥对的公钥加密会话密钥,发送给服务器端,由于攻击者没有服务器的私钥,所以无法解密会话密钥
- 服务端用它的私钥解密出会话密钥
- 至此双方完成连接,接下来服务器端和客户端可以使用对称加密算法和会话密钥加密解密数据
上述是典型的RSA流程,会话密钥完全由客户端控制。而DH算法就是要将会话密钥也要通信双方协商一下。
-
椭圆曲线密码(Elliptic Curve Cryptography, ECC): 主要目的是解决性能问题,避免密钥的长度太长。
-
数字签名: 对比现实生活中的合同签字,算法目的就是要防止抵赖,是下面证书的算法基础。
这里也只是部分列举了在HTTPS中涉及的密码学算法,可以想见,为了实现安全的通信要利用的密码学算法是非常多的。因此在浏览器和服务器通信的流程中,很重要的一步就是要确认加密需要的密码学套件。而这块是已经标准化了的,由官方机构维护常用的套件。
证书
证书是我们在配置https网站的时候绕不过去的一环,网站引入证书才能避免中间人攻击。说到证书就必须要提下PKI(Public Key Infrastructure, 公钥基础设施),它是一系列的软件集合来提供身份验证服务。通过找到一个可信的第三方,认证的技术方案就是数字签名技术。第三方组织能够使用数字签名技术管理整数。
PKI中设置了众多的标准,而HTTPS采用的是其中 X.509标准,组织如图所示:

而证书按照分类可以有好多种:
1) 根据验证模式分可以有DV(Domain Validated)证书,OV(Organization Validated)证书,EV(Extended Validated)证书。其中DV审批最容易,只要有个域名和服务器信息就行,OV证书严格点,一般是中大型企业和政府机构持有,而EV审核是最严的,花费也更高,当然功能也更多。
2)根据域名进行分类:
- 单域名证书:单个域名,例如www.example.com
- 泛域名证书: 可以包括各种二级域名
- SAN(Subject Alternative Names)证书:支持多个注册域,例如将.com,.cn的放在一起
- SAN 泛域名证书:在SAN的基础上再加上二级域名
整个证书的信任逻辑是从根证书开始的链,这条链上包括三种类型的证书,根证书、中间证书、服务器实体证书。

同时证书本身是有期限的,所以一定会有配套的过期和吊销机制。在链接时,浏览器就会查询证书的有效性。这里的实现方式有很多,主流的有CRL(Certificate Revocation List)和OCSP(Online Certificate Status Protocol, 在线证书状态协议).有兴趣的朋友可以通过其他资料深入研究下。
http迁移到https
现在https慢慢会成为主流,例如有google强制将http网站设置为不安全的等操作助推这一趋势。所以未来不管出于那种考虑,搭建https的网站也是势在必行的。这里有人可能会考虑使用https又是各种通讯,又是各种加密解密,应该是很耗性能吧。其实大厂已经帮你都测过了,综合的CPU和带宽消耗很低,都低于2%左右。所以完全不用担心,另外如果https配合新的http2协议,那么更加没有性能上的担忧。
但现如今很多http网站想要从http迁移到https还是比较有挑战的。如果是简单的静态站那就另当别论,针对中大型网站,例如stackOverflow,下面都有很多域名,很多编码的http请求,这就属于混合问题。那一般的解决方案是:
- 301重定向:就是将打过来的http请求强制跳转到https,但这里是有性能影响的。熟悉前端web性能优化的朋友一定知道,减少重定向是一个很重要的性能优化点;
- HSTS: 这是一个https的协议头配置字段,用来让浏览器在今后的一段时间内记住都要用https来请求站点
- CSP:安全策略主要是通过协议头的形式限定死能够加载的资源地址范围,从而消除XSS跨站攻击的。而在这里也可以帮助设置https的请求。
在实战中,我们一般会综合运用各种手段来实现http到https的平稳迁移,具体的操作可以参考虞卫东老师的<深入浅出HTTPS>里面有非常详尽的实操分享。
资源&工具
解析https工具是必不可少的,下面就来简单列举下:
- openssl:开源库,广泛使用在各大linux pc和服务器上,基本上能够使用所有的密码库跟工具。命令行操作非常方便,基础中的基础;
- wireshark: 经典的网络分析抓包工具,当然也能截获https的数据流来分析
- tcpdump: 难得的linux 命令来支持抓包
- chorme dev工具: Security Tab可以查看包括证书在内的很多安全信息
- RFC官方文档:覆盖所有标准和协议的文档,深入学习者必备
网友评论