本章目录
- 3. HTTPS协议
- 3.1 HTTPS协议简介
- 3.2 SSL/TLS协议
- 3.2.1 SSL/TLS功能的实现
- 3.3 HTTP和HTTPS的区别
- 3.4 HTTPS协议的优点
- 3.5 HTTPS协议的缺点
- 3.6 HTTPS协议的工作流程
- 3.7 HTTPS是如何解决HTTP的缺点的
- 3.7.1 解决内容可能被窃听的问题——加密
- 3.7.1.1 方法1.对称加密
- 3.7.1.2 方法2.非对称加密
- 3.7.1.3 方法3.对称加密+非对称加密(HTTPS采用这种方式)
- 3.7.2 解决报文可能遭篡改问题——数字签名
- 3.7.2.1 数字签名生成过程
- 3.7.2.2 客户端校验数字签名
- 3.7.3 解决通信方身份可能被伪装的问题——数字证书
- 3.7.3.1 伪装通信方身份的场景
- 3.7.3.2 如何解决公钥传输的依赖性问题
- 3.7.3.3 数字证书认证机构的业务流程
- 3.8 带有证书的公钥传输机制
3. HTTPS协议
实际使用中,绝大多数的网站现在都采用的是https协议,这也是未来互联网发展的趋势。
3.1 HTTPS协议简介
HTTPS协议(Hypertext Transfer Protocol Secure Socket Layer),是HTTP协议的加强安全版本。HTTPS协议是基于HTTP协议的,也是基于TCP协议作为底层协议,并额外使用SSL/TLS协议用作加密和安全认证。现在它被广泛用于网上安全敏感的通讯,例如交易支付方面。
-
HTTPS协议默认端口号为443
-
HTTPS协议可简单理解为HTTP+SSL/TLS,通过SSL证书来①验证服务器的身份,②并为浏览器和服务器之间的通信进行加密。
-
HTTPS协议是将HTTP通信接口部分用SSL或TLS协议代替而已。
3.2 SSL/TLS协议
3.2.1 SSL/TLS功能的实现
SSL/TLS功能的实现主要依赖于三类基本算法:
- 散列函数
- 验证信息的完整性
- 对称加密
- 采用协商的秘钥对数据加密
- 非对称加密
- 实现身份认证和密钥协商
3.3 HTTP和HTTPS的区别
- 收费:HTTPS协议需要到CA申请证书,一般免费证书较少,因而需要一定的费用
- 安全:HTTP是超文本传输协议,信息是明文传输;HTTPS是具有安全性的SSL加密传输协议
- 连接方式与端口:二者连接方式不同,使用的服务器端口也不一样,HTTP使用80端口,而HTTPS使用443端口
- 数据隐私性:HTTPS协议通信内容经过对称加密,每个连接生成一个唯一的加密密钥
- 数据完整性:内容传输经过完整性校验
- 身份认证:第三方无法伪造服务端(客户端)身份
3.4 HTTPS协议的优点
尽管HTTPS并非绝对安全,掌握根证书的机构、掌握加密算法的组织同样可以进行中间人形式的攻击,但HTTPS仍是现行架构下最安全的解决方案。
主要有以下几个好处:
- 使用HTTPS协议可认证用户和服务器,确保数据发送到正确的客户端和服务器;
- HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比http协议安全,可防止数据在传输过程中不被窃取、改变,确保数据的完整性。
- HTTPS是现行架构下最安全的解决方案,虽然不是绝对安全,但它大幅增加了中间人攻击的成本。
3.5 HTTPS协议的缺点
- HTTPS协议握手阶段比较费时,会使也免得加载时间延长近50%,增加10%-20%的耗电
- HTTPS连接缓存不如HTTP高效,会增加数据开销和功耗,甚至已有的安全措施也会因此受到影响
- SSL证书收费,功能越强大的证书费用越高
- SSL证书需要绑定IP,不能在同一IP上绑定多个域名,IPv4资源不能支持这个消耗
- HTTPS协议的加密范围也比较有限,并且SSL证书的信用链体系并不安全。
3.6 HTTPS协议的工作流程
1.Client发起一个HTTPS的请求(比如https://juejin.cn/user/4283353031252967
),根据RFC2818的规定,Client知道需要连接Server的443(默认)端口。
2.Server把事先配置好的公钥证书(public key certificate)返回给客户端。
3.Client验证公钥证书:比如是否在有效期内,证书的用途是不是匹配Client请求的站点,是不是在CRL吊销列表里面,它的上一级证书是否有效,这是一个递归的过程,直到验证到根证书(操作系统内置的Root证书或者Client内置的Root证书)。如果验证通过则继续,不通过则显示警告信息。
4.Client使用伪随机数生成器生成加密所使用的对称密钥,然后用证书的公钥加密这个对称密钥,发给Server。
5.Server使用自己的私钥(private key)解密这个消息,得到对称密钥。至此,Client和Server双方都持有了相同的对称密钥。
6.Server使用对称密钥加密“明文内容A”,发送给Client。
7.Client使用对称密钥解密响应的密文,得到“明文内容A”。
8.Client再次发起HTTPS的请求,使用对称密钥加密请求的“明文内容B”,然后Server使用对称密钥解密密文,得到“明文内容B”。
3.7 HTTPS是如何解决HTTP的缺点的
3.7.1 解决内容可能被窃听的问题——加密
3.7.1.1 方法1.对称加密
这种方式加密和解密使用同一个密钥。加密和解密都会用到密钥。没有密钥就无法对密码解密,反过来说,任何人只要持有密钥就能解密了。
以对称加密方式加密时必须将密钥也发给对方。可究竟怎样才能安全地转交?在互联网上转发密钥时,如果通信被监听那么密钥就可会落人攻击者之手,同时也就失去了加密的意义。另外还得设法安全地保管接收到的密钥。
3.7.1.2 方法2.非对称加密
公开密钥加密使用一对非对称的密钥。一把叫做私有密钥,另一把叫做公开密钥。顾名思义,私有密钥不能让其他任何人知道,而公开密钥则可以随意发布,任何人都可以获得。
使用公开密钥加密方式,发送密文的一方使用对方的公开密钥进行加密处理,对方收到被加密的信息后,再使用自己的私有密钥进行解密。利用这种方式,不需要发送用来解密的私有密钥,也不必担心密钥被攻击者窃听而盗走。
非对称加密的特点是信息传输一对多,服务器只需要维持一个私钥就能够和多个客户端进行加密通信。
这种方式有以下缺点:
- 公钥是公开的,所以针对私钥加密的信息,黑客截获后可以使用公钥进行解密,获取其中的内容;
- 公钥并不包含服务器的信息,使用非对称加密算法无法确保服务器身份的合法性,存在中间人攻击的风险,服务器发送给客户端的公钥可能在传送过程中被中间人截获并篡改;
- 使用非对称加密在数据加密解密过程需要消耗一定时间,降低了数据传输效率;
3.7.1.3 方法3.对称加密+非对称加密(HTTPS采用这种方式)
使用对称密钥的好处是解密的效率比较快,使用非对称密钥的好处是可以使得传输的内容不能被破解,因为就算你拦截到了数据,但是没有对应的私钥,也是不能破解内容的。就比如说你抢到了一个保险柜,但是没有保险柜的钥匙也不能打开保险柜。那我们就将对称加密与非对称加密结合起来,充分利用两者各自的优势,在交换密钥环节使用非对称加密方式,之后的建立通信交换报文阶段则使用对称加密方式。
具体做法是:发送密文的一方使用对方的公钥进行加密处理“对称的密钥”,然后对方用自己的私钥解密拿到“对称的密钥”,这样可以确保交换的密钥是安全的前提下,使用对称加密方式进行通信。所以,HTTPS采用对称加密和非对称加密两者并用的混合加密机制。
Note:SSL/TLS协议为什么要使用非对称加密和对称加密结合的方式?
- 使用对称密钥的好处是解密的效率比较快,对称加密的保密性完全依赖于密钥的保密性
- 使用非对称密钥的好处是可以使得传输的内容不能被破解
- 因此为了结合二者的优点,在通信双方第一次建立通信时,进行一次非对称加密,交换对称加密的密钥,在之后的信息通信中,使用该对称密钥对信息进行对称加密。
3.7.2 解决报文可能遭篡改问题——数字签名
网络传输过程中需要经过很多中间节点,虽然数据无法被解密,但可能被篡改,那如何校验数据的完整性呢?----校验数字签名。
数字签名,是 CA 在给服务器颁发证书时,使用散列+加密的组合技术,在证书上盖个章,以此来提供验伪的功能。
数字签名有两个作用:
- 能确定消息确实是由发送方签名并发出来的,因为别人假冒不了发送方的签名。
- 数字签名能确定消息的完整性,证明数据是否未被篡改过。
3.7.2.1 数字签名生成过程
CA对服务器提交的公钥,采用散列函数生成一个消息摘要。CA使用CA私钥对该摘要进行加密,并附在证书下方,这样数字签名就生成了。然后CA将带有数字签名的证书发送给服务器。
3.7.2.2 客户端校验数字签名
服务器将带有数字签名的CA证书发送给客户端,客户端需要验证该证书的身份。
客户端找到第三方机构CA,得到CA的公钥,并用CA公钥对证书的数字签名进行解密,就可获得CA生成的摘要。
客户端对证书中的服务器公钥做相同的散列处理,得到一个摘要,将该摘要和之前从数字签名中解密得到的CA生成的摘要进行对比。如果相同,则身份验证成功,说明收到的信息是完整的,否则验证失败,说明信息被修改过。
3.7.3 解决通信方身份可能被伪装的问题——数字证书
3.7.3.1 伪装通信方身份的场景
客户端 C 和服务器 S 想要使用 SSL/TLS 通信,C 需要先知道 S 的公钥,而 S 公钥的唯一获取途径,就是把 S 公钥在网络信道中传输。要注意网络信道通信中有几个前提:
- 任何人都可以捕获通信包
- 通信包的保密性由发送者设计
- 保密算法设计方案默认为公开,而(解密)密钥默认是安全的
因此,假设存在一个攻击者 A,发送给 C 一个诈包来假装是 S 的公钥,其实是诱饵服务器 AS 的公钥。当 C 收获了 AS 的公钥(却以为是 S 的公钥),C 后续就会使用 AS 公钥对数据进行加密,并在公开信道传输,那么 A 将捕获这些加密包,用 AS 的私钥解密,就截获了 C 本要给 S 发送的内容,而 C 和 S 二人全然不知。
3.7.3.2 如何解决公钥传输的依赖性问题
为了解决公钥传输的信赖性问题,第三方机构应运而生——证书颁发机构(CA,Certificate Authority)。
CA默认是客户端和服务器都受信任的第三方,它会给各个服务器颁发证书,证书存储在服务器上,并附有CA的电子签名。
当客户端C向服务器S发送HTTPS请求时,一定要先获取目标服务器的证书,并根据证书上的信息,检验证书的合法性。一旦客户端监测到证书非法,就会发生错误。客户端获取了服务器的证书以后,由于证书的信任性是由第三方信赖机构认证的,而证书上又包含着服务器的公钥信息,客户端就可以放心的信任证书上的公钥就是目标服务器的公钥。
3.7.3.3 数字证书认证机构的业务流程
- 服务器的运营人员向第三方机构CA提交公钥、组织信息、个人信息(域名)等信息并申请认证;
- CA通过线上、线下等多种手段验证申请者提供信息的真实性,如组织是否存在、企业是否合法,是否拥有域名的所有权等;
- 如信息审核通过,CA会向申请者签发认证文件-证书。证书包含以下信息:申请者公钥、申请者的组织信息和个人信息、签发机构 CA的信息、有效时间、证书序列号等信息的明文,同时包含一个签名。 其中签名的产生算法:首先,使用散列函数计算公开的明文信息的信息摘要,然后,采用 CA的私钥对信息摘要进行加密,密文即签名;
- 客户端 Client 向服务器 Server 发出请求时,Server 返回证书文件;
- 客户端 Client 读取证书中的相关的明文信息,采用相同的散列函数计算得到信息摘要,然后,利用对应 CA的公钥解密签名数据,对比证书的信息摘要,如果一致,则可以确认证书的合法性,即服务器的公开密钥是值得信赖的。
- 客户端还会验证证书相关的域名信息、有效时间等信息; 客户端会内置信任CA的证书信息(包含公钥),如果CA不被信任,则找不到对应 CA的证书,证书也会被判定非法。
3.8 带有证书的公钥传输机制
- 设有服务器 S,客户端 C,和第三方信赖机构 CA。
- S 信任 CA,CA 是知道 S 公钥的,CA 向 S 颁发证书。并附上 CA 私钥对消息摘要的加密签名。
- S 获得 CA 颁发的证书,将该证书传递给 C。
- C 获得 S 的证书,信任 CA 并知晓 CA 公钥,使用 CA 公钥对 S 证书山的签名解密,同时对消息进行散列处理,得到摘要。比较摘要,验证 S 证书的真实性。
- 如果 C 验证 S 证书是真实的,则信任 S 的公钥(在 S 证书中)。