HTTP 协议(HyperText Transfer Protocol,超文本传输协议)是客户端浏览器或其他程序与Web服务器之间的应用层通信协议 。HTTP协议传输的数据都是未加密的,也就是明文的,因此使用HTTP协议传输隐私信息非常不安全。为了保证这些隐私数据能加密传输,于是Netscape 公司设计了SSL(Secure Sockets Layer)协议用于对HTTP协议传输的数据进行加密,从而就诞生了HTTPS。HTTPS 协议(HyperText Transfer Protocol over Secure Socket Layer)可以理解为 HTTP+SSL/TLS, 即 HTTP 下加入 SSL 层,HTTPS 的安全基础是 SSL,因此加密的详细内容就需要 SSL,用于安全的 HTTP 数据传输。如下图所示 HTTPS 相比 HTTP 多了一层 SSL/TLS:
SSL(Secure Socket Layer,安全套接字层):1994年为 Netscape 所研发,SSL 协议位于 TCP/IP 协议与各种应用层协议之间,为数据通讯提供安全支持。SSL目前的版本是3.0,被IETF(Internet Engineering Task Force)定义在RFC 6101中,之后IETF对SSL 3.0进行了升级,于是出现了TLS(Transport Layer Security) 1.0,定义在RFC 2246。
TLS(Transport Layer Security,传输层安全):其前身是 SSL,它最初的几个版本(SSL 1.0、SSL 2.0、SSL 3.0)由网景公司开发,1999年从 3.1 开始被 IETF 标准化并改名,发展至今已经有 TLS 1.0、TLS 1.1、TLS 1.2 三个版本。SSL3.0和TLS1.0由于存在安全漏洞,已经很少被使用到。TLS 1.3 改动会比较大,目前还在草案阶段,目前使用最广泛的是TLS 1.1、TLS 1.2。
实际上我们现在的HTTPS都是用的TLS协议,但是由于SSL出现的时间比较早,并且依旧被现在浏览器所支持,因此SSL依然是HTTPS的代名词,但无论是TLS还是SSL都是上个世纪的事情,SSL最后一个版本是3.0,今后TLS将会继承SSL优良血统继续为我们进行加密服务。
SSL/TLS 协议位于 TCP/IP 和HTTP协议之间,其作用如下:
1> 认证用户和服务器,确保数据发送到正确的客户机和服务器 -> 验证证书
2> 加密数据以防止数据中途被窃取 -> 加密
3> 维护数据的完整性,确保数据在传输过程中不被改变 -> 摘要算法
HTTPS在传输数据之前需要客户端(浏览器)与服务端(网站)之间进行一次握手,在握手过程中将确立双方加密传输数据的密码信息。TLS/SSL协议中使用了非对称加密,对称加密以及信息摘要算法。握手过程的简单描述如下:
1> 客户端将自己支持的一套加密算法(一般是对称加密)、信息摘要算法、随机数random_C等信息发送给服务端。
2> 服务端从中选择一组加密算法与信息摘要算法以及随机数random_S和配置的CA证书一同发回给浏览器,证书里面包含了网站地址,加密公钥,以及证书的颁发机构、签名等信息,用于身份验证与密钥交换。
3> 客户端回应:
a)校验证书的合法性:如果验证通过才会进行后续通信,否则根据错误情况不同做出提示和操作,合法性验证包括:
b)如果证书受信任或用户接受了不受信的证书,则客户端计算产生随机数字 pre-master,并用证书公钥加密,发送给服务器;
c)通过之前协商好的两个明文随机数 random_C 和 random_S 与自己计算产生的 pre-master 随机数,计算得到协商密钥:enc_key=Fuc(random_C, random_S, Pre-Master),这个协商密钥就是过程1、2协商好的加密算法的密钥;
d)通知服务端后续的通信都采用之前协商的通信密钥和加密算法进行加密通信;
e)使用协商的信息摘要算法计算出之前所有通信参数的 hash 值结合其它相关信息生成一段数据,采用协商密钥与算法进行加密,然后发送给服务器用于数据与握手验证;
4> 服务端回应:
a)使用私钥解密加密的 pre-master 数据,基于之前交换的两个明文随机数 random_C 和 random_S,计算得到协商密钥:enc_key=Fuc(random_C, random_S, Pre-Master);
b)使用计算出的协商密钥解密客户端发送的握手信息,并计算出之前所有接收信息的 hash 值,验证数据和密钥正确性;
c)如果验证通过,服务器同样告知客户端后续的通信都采用协商的密钥与算法进行加密通信;
d)服务端也结合所有当前的通信参数信息生成一段数据以及 hash 值并采用协商密钥与算法加密并发送到客户端;
5> 客户端计算所有接收信息的 hash 值,并采用协商密钥解密握手信息,验证服务器发送的数据和密钥,验证通过则握手完成,握手过程中如果有任何错误,都会使加密连接断开,从而阻止了隐私信息的泄露。
6> 开始使用协商密钥与算法进行加密通信。
注:服务器也可以要求验证客户端,即双向认证,可在过程2中发送 client_certificate_request 信息,然后客户端在过程3中先发送 client_certificate与certificate_verify_message 信息。证书的验证方式基本相同,certificate_verify_message 是采用client的私钥加密的一段基于已经协商的通信信息得到数据,服务器可以采用对应的公钥解密并验证。
HTTPS通信过程的简单时序图如下:
客户端与服务端互相发送加密的握手消息并验证,目的是为了保证双方都获得了一致的密码,并且可以正常的加密解密数据,为后续真正数据的传输做一次测试。另外,HTTPS一般使用的加密与信息摘要算法如下:
其中非对称加密算法用于在握手过程中加密生成的对称加密算法的密钥,对称加密算法用于对真正传输的数据进行加密,而信息摘要算法用于验证数据的完整性。由于浏览器生成的对称密钥是整个数据加密的关键,因此在传输的时候使用了非对称加密算法对其加密。非对称加密算法会生成公钥和私钥,公钥只能用于加密数据,因此可以随意传输,而网站的私钥用于对数据进行解密,所以网站都会非常小心的保管自己的私钥,防止泄漏。
CA机构如何颁发数字证书给服务器端的?
拿到证书后,我们就可以将证书配置到自己的服务器上,客户端后续就可以https方式访问了。
HTTPS原理通俗了解
HTTPS加密协议详解(四):TLS/SSL握手过程
SSL双向认证和SSL单向认证的区别