计算机网络之HTTPS

251 阅读8分钟

HTTPS一直是一个高频的面试问题在这里记录一下。HTTPS与HTTP不同的是使用了加密,因此HTTPS传输的不再是明文而是密文。这里主要记录一下HTTPS的工作细节。

HTTPS使用了TLS/SSL协议来对内容进行加密。TLS工作的层众说纷纭有的分类到传输层有的分到应用层。简单来说就是介于传输层和应用层之间的一层协议,下是TCP上是HTTPS。

首先看一下HTTPS的TLS握手流程:

可以看出SSL/TLS在秘钥协商阶段使用的非对称加密,在信息传输阶段使用的是对称加密。对称加密的秘钥就是之前用非对称加密协商的。关于对称加密和非对称加密这里不做赘述。SSL/TLS中很重要的一个概念是证书。下面主要来讲这个证书的作用。

首先我们要搞懂加密的目的是什么。加密的主要目的之一是为了防止中间人攻击。我们现在就一步步来看HTTPS是怎么防止中间人攻击的。

一开始我们先考虑最简单的场景,就是明文传输。这种情况下攻击者只要劫持了两个人的通讯流量所有的信息对攻击者来说都是透明的。**HTTPS加密的根本目的就是防止中间人劫持到了流量也解析不出来具体的通信内容。**后面的所有操作都是从这个目的出发解决某些场景下的问题。

既然需要加密那么就需要秘钥,而且需要两个人都知道这个秘钥,这个就是著名的秘钥协商。既然两个人都要知道这个秘钥那么这个秘钥也需要传输。那么问题来了,如果这个协商的过程也被劫持了怎么办?中间人也有秘钥等于你们的操作对攻击者来说没有意义。所以就需要一个机制来解决这个问题。

解决秘钥劫持问题

解决这个问题就需要使用大名鼎鼎的非对称加密。用公钥加密的只可以用私钥解密,公钥可以公开。同样私钥加密的也可以用公钥解密,但是私钥多数是用来做数字签名,用公钥去验证。这样的话在秘钥协商阶段可以用对端传过来的公钥来加密,即使被劫持了也没有所谓。因为有了公钥也没有办法解密密文。但是如果中间人劫持了这个交换过程,用自己的公私钥对来进行通信又该怎么办呢?比如A<->B 进行通信,C是攻击者。在B->A发送公钥这个过程中,C劫持到这个流量并把B发给A的公钥换成自己C的。这样A拿到的实际是C的公钥,而C又持有自己的私钥这样这个流程就又被破坏了。详情请看图。

解决身份伪造问题

针对这个问题HTTPS使用了证书来解决,通过证书来证明你是你自己。我们知道在非对称加密这个机制中通过私钥可以对信息进行签名,而收到签名一方的可以使用公开的公钥进行验证。证书本质上就是通过一个存储了正确的实体与公钥对应关系受信任的一方(牵扯到证书链,后面再说),去证明证书附带的其他信息比如域名和公钥是正确的。

CA证书与证书链

身份验证CA和证书

解决上述身份验证问题的关键是确保获取的公钥途径是合法的,能够验证服务器的身份信息,为此需要引入权威的第三方机构CA(如沃通CA)。CA 负责核实公钥的拥有者的信息,并颁发认证"证书",同时能够为使用者提供证书验证服务,即PKI体系(PKI基础知识)。

基本的原理为,CA负责审核信息,然后对关键信息利用私钥进行"签名",公开对应的公钥,客户端可以利用公钥验证签名。CA也可以吊销已经签发的证书,基本的方式包括两类 CRL 文件和 OCSP。CA使用具体的流程如下:

![](https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2018/5/11/1634e5e77b83b06c~tplv-t2oaga2asx-image.image)

a.服务方S向第三方机构CA提交公钥、组织信息、个人信息(域名)等信息并申请认证;

b.CA通过线上、线下等多种手段验证申请者提供信息的真实性,如组织是否存在、企业是否合法,是否拥有域名的所有权等;

c.如信息审核通过,CA会向申请者签发认证文件-证书。 证书包含以下信息:申请者公钥、申请者的组织信息和个人信息、签发机构 CA的信息、有效时间、证书序列号等信息的明文,同时包含一个签名; 签名的产生算法:首先,使用散列函数计算公开的明文信息的信息摘要,然后,采用 CA的私钥对信息摘要进行加密,密文即签名;

d.客户端 C 向服务器 S 发出请求时,S 返回证书文件;

e.客户端 C读取证书中的相关的明文信息,采用相同的散列函数计算得到信息摘要,然后,利用对应 CA的公钥解密签名数据,对比证书的信息摘要,如果一致,则可以确认证书的合法性,即公钥合法;

f.客户端然后验证证书相关的域名信息、有效时间等信息;

g.客户端会内置信任CA的证书信息(包含公钥),如果CA不被信任,则找不到对应 CA的证书,证书也会被判定非法。

在这个过程注意几点:

a.申请证书不需要提供私钥,确保私钥永远只能服务器掌握;

b.证书的合法性仍然依赖于非对称加密算法,证书主要是增加了服务器信息以及签名;

c.内置 CA 对应的证书称为根证书,颁发者和使用者相同,自己为自己签名,即自签名证书(为什么说"部署自签SSL证书非常不安全")

d.证书=公钥+申请者与颁发者信息+签名;

证书链

如 CA根证书和服务器证书中间增加一级证书机构,即中间证书,证书的产生和验证原理不变,只是增加一层验证,只要最后能够被任何信任的CA根证书验证合法即可。

a.服务器证书 server.pem 的签发者为中间证书机构 inter,inter 根据证书 inter.pem 验证 server.pem 确实为自己签发的有效证书;

b.中间证书 inter.pem 的签发 CA 为 root,root 根据证书 root.pem 验证 inter.pem 为自己签发的合法证书;

c.客户端内置信任 CA 的 root.pem 证书,因此服务器证书 server.pem 的被信任。

![](https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2018/5/11/1634e5e780e86798~tplv-t2oaga2asx-image.image)

服务器证书、中间证书与根证书在一起组合成一条合法的证书链,证书链的验证是自下而上的信任传递的过程。 二级证书结构存在的优势:

a.减少根证书结构的管理工作量,可以更高效的进行证书的审核与签发;

b.根证书一般内置在客户端中,私钥一般离线存储,一旦私钥泄露,则吊销过程非常困难,无法及时补救;

c.中间证书结构的私钥泄露,则可以快速在线吊销,并重新为用户签发新的证书;

d.证书链四级以内一般不会对 HTTPS 的性能造成明显影响。

证书链有以下特点:

a.同一本服务器证书可能存在多条合法的证书链。 因为证书的生成和验证基础是公钥和私钥对,如果采用相同的公钥和私钥生成不同的中间证书,针对被签发者而言,该签发机构都是合法的 CA,不同的是中间证书的签发机构不同;

b.不同证书链的层级不一定相同,可能二级、三级或四级证书链。 中间证书的签发机构可能是根证书机构也可能是另一个中间证书机构,所以证书链层级不一定相同。

其他注意点

1. 为了性能,真正的对明文加密的使用的是对称加密,非对称加密仅仅用于秘钥协商。

2. HTTPS并不能阻止抓包。如果通信双方安装了攻击者制作的根CA证书,那么攻击者的CA证书可以使用伪造的证书链来进行验证。

3. 关于TLS和SSL的关系。TLS是SSL 3.0的后续版本。在TLS与SSL3.0之间存在着显著的差别,主要是它们所支持的加密算法不同,所以TLS与SSL3.0不能互操作。现在使用的一般都是TLS

参考资料:

razeencheng.com/post/ssl-ha…

www.freebuf.com/articles/ne…

juejin.cn/post/684490…