概念
HTTPS = HTTP + SSL/TLS
HTTPS
(Secure Hypertext Transfer Protocol)安全超文本传输协议,是经过SSL/TLS加密的HTTP协议,端口号为443。其设计的主要目的是,提供对网站服务器的身份认证、保护交换数据的隐私与完整性。
TLS/SSL
概述
TLS/SSL
是介于TCP和HTTP之间的一层安全协议
用非对称加密的手段传递密钥,然后用密钥进行对称加密传递数据
SSL(Secure Socket Layer)
1994年由 浏览器开发商Netscape公司 率先倡导研发,为数据通讯提供安全支持,开发了最初的几个版本SSL 1.0、SSL 2.0、SSL 3.0。
TLS(Transport LayerSecurity)
前身为SSL,1999年从 3.1 开始被 IETF(Internet Engineering Task Force,Internet 工程任务组)标准化并改名,发展至今已经有 TLS 1.0、TLS 1.1、TLS 1.2 三个版本。SSL3.0和TLS1.0由于存在安全漏洞,已经很少被使用到;TLS 1.3 改动会比较大,目前还在草案阶段,目前使用最广泛的是TLS 1.1、TLS 1.2;
对称加密和非对称加密
对称加密
对称加密,顾名思义就是加密和解密都是使用同一个密钥,常见的对称加密算法有 DES、3DES 和 AES 等。
- 优点:算法公开、计算量小、加密速度快、加密效率高,适合加密比较大的数据。
- 缺点:
- 交易双方需要使用相同的密钥,也就无法避免密钥的传输,而密钥在传输过程中无法保证不被截获,因此对称加密的安全性得不到保证。
- 每对用户每次使用对称加密算法时,都需要使用其他人不知道的唯一密钥,这会使得发收信双方所拥有的钥匙数量急剧增长,密钥管理成为双方的负担。对称加密算法在分布式网络系统上使用较为困难,主要是因为密钥管理困难,使用成本较高。
非对称加密
非对称加密,顾名思义就是加密和解密需要使用两个不同的密钥:公钥(public key)和私钥(private key)。公钥与私钥是一对,如果用公钥对数据进行加密,只有用对应的私钥才能解密;如果用私钥对数据进行加密,那么只有用对应的公钥才能解密。
- 优点:算法公开,加密和解密使用不同的钥匙,私钥不需要通过网络进行传输,安全性很高。
- 缺点:计算量比较大,加密和解密速度相比对称加密慢很多,加密的内容长度不能超过公钥的长度。
握手过程
RSA算法
- “client hello”:客户端通过发送”client hello”消息向服务器发起握手请求,该消息包含了客户端所支持的 TLS 版本和密码组合以供服务器进行选择,还有一个”client random“随机字符串。
- “server hello”:服务器发送”server hello”消息对客户端进行回应,该消息包含了数字证书,服务器选择的密码组合和”server random“随机字符串。
- 证书验证:客户端对服务器发来的证书进行验证,确保对方的合法身份,验证过程可以细化为以下几个步骤:
- 检查数字签名
- 验证证书链 (这个概念下面会进行说明)
- 检查证书的有效期
- 检查证书的撤回状态 (撤回代表证书已失效)
- 计算“Pre-Master Secret”:客户端向服务器发送另一个随机字符串”premaster secret (预主密钥)“,这个字符串是经过服务器的公钥加密过的,只有对应的私钥才能解密。
- 使用私钥:服务器使用私钥解密”premaster secret”。
- 生成共享密钥:客户端和服务器均使用 client random,server random 和 premaster secret,并通过相同的算法生成相同的共享密钥 KEY。
- 客户端就绪:客户端发送经过共享密钥 KEY加密过的”finished”信号。
- 服务器就绪:服务器发送经过共享密钥 KEY加密过的”finished”信号。
- 达成安全通信:握手完成,双方使用对称加密进行安全通信。
DH算法
- “client hello”:客户端通过发送”client hello”消息向服务器发起握手请求,该消息包含了客户端所支持的 TLS 版本和密码组合以供服务器进行选择,还有一个”client random“随机字符串。
- “server hello”:服务器发送”server hello”消息对客户端进行回应,该消息包含了数字证书,服务器选择的密码组合和”server random“随机字符串。
- 证书验证:客户端对服务器发来的证书进行验证,确保对方的合法身份,验证过程可以细化为以下几个步骤:
- 检查数字签名
- 验证证书链 (这个概念下面会进行说明)
- 检查证书的有效期
- 检查证书的撤回状态 (撤回代表证书已失效)
- 服务器密钥交换消息:服务器生成一对公钥和私钥,将公钥发送给客户端,服务器密钥交换完成后,服务器将发送Server Hello Done 消息。
- 客户端密钥交换:客户端生成一对公钥和私钥,将公钥发送给服务器。
- 计算“Pre-Master Secret”:客户端和服务端使用DH算法生成一个相同的”premaster secret (预主密钥)“。
- 生成共享密钥:客户端和服务器均使用 client random,server random 和 premaster secret,并通过相同的算法生成相同的共享密钥 KEY。
- 客户端就绪:客户端发送经过共享密钥 KEY加密过的”finished”信号。
- 服务器就绪:服务器发送经过共享密钥 KEY加密过的”finished”信号。
- 达成安全通信:握手完成,双方使用对称加密进行安全通信。
使用Diffie Hellman算法进行TLS密钥交换具有优势。客户端和服务器都为每个新会话生成一个新密钥对。一旦计算出预主密钥,将立即删除客户端和服务器使用DH算法创建的私钥。这意味着私钥永远不会被窃取,确保完美的前向保密。
消息验证代码(MAC)和TLS数据完整性
TLS为客户端和服务器分配了单独的密钥,它们都来自主密钥本身,换句话说,主密钥不直接用于加密数据,而是将单独的加密密钥用于客户端和服务器。由于双方都有两个密钥,服务器用其密钥加密的数据可以由客户端轻松解密,反之亦然。
TLS还具有用于对称密钥加密的附加安全机制。
窃听者可以对传输中的加密数据进行两种可能的攻击:尝试解密数据或尝试修改数据。只要密钥安全,我们就可以认为解密基本上是不可能的,但如果是修改数据呢?客户端和服务器是怎么知道攻击者没有修改过数据呢?如上所述,TLS不仅仅是加密数据,还可以保护数据,使其免受未检测到的修改,换句话说,TLS可以检查数据的完整性。
当服务器或客户端使用主密钥加密数据时,它还会计算明文数据的校验和(哈希值),这个校验和称为消息验证代码(MAC)。然后在发送之前将MAC包含在加密数据中。密钥用于从数据中生成MAC,以确保传输过程中攻击者无法从数据中生成相同的MAC,故而MAC被称为HMAC(哈希消息认证码)。另一方面,在接收到消息时,解密器将MAC与明文分开,然后用它的密钥计算明文的校验和,并将其与接收到的MAC进行比较,如果匹配,那我们就可以得出结论:数据在传输过程中没有被篡改。
客户端和服务器必须使用相同的散列算法来创建以及验证MAC,例如密码套件TLS_ECDHE_ECDSA_WITH_AES_128_GCM_ SHA256
中的SHA256 是用于处理HMAC的哈希函数,为了提高安全性,客户端和服务器使用MAC密钥。让我们看看这些是什么。
数字证书
概念
在非对称加密通信过程中,服务器需要将公钥发送给客户端,在这一过程中,公钥很可能会被第三方拦截并替换,然后这个第三方就可以冒充服务器与客户端进行通信,这就是传说中的“中间人攻击”(man in the middle attack)。解决此问题的方法是通过受信任的第三方交换公钥,具体做法就是服务器不直接向客户端发送公钥,而是要求受信任的第三方,也就是证书认证机构 (Certificate Authority, 简称 CA)将公钥合并到数字证书中,然后服务器会把公钥连同证书一起发送给客户端,私钥则由服务器自己保存以确保安全。
证书校验
要证明证书的真实性,通常依赖于一组受信任的第三方证书颁发机构(Certificate authorities, CA)。验证 TLS 证书有效性的方法如下:
检查证书是否是浏览器中受信任的根证书机构颁发
证书都是上级 CA 签发的,上级的 CA 可能还有上级,直到找到根证书。
检查证书中的证书吊销列表(CRL),看证书是否已经被吊销
证书被吊销后,会被记录在证书吊销列表中,CA 会定期发布 CRL。应用程序可以根据 CRL 来检查证书是否被吊销。
通过在线证书状态协议(OCSP)检查证书是否有效
CA 会提供实时的查询接口,用来查询证书的有效性。在线实时查询会使得 TLS 握手时间延长,因为浏览器需要等待查询结束才能继续 TLS 握手。至于使用在线查询还是证书中的吊销列表,由浏览器决定。
检查证书是否过期
检查域名和证书中的域名是否一致
查询网站是否被列入了欺诈网站黑名单
这一步 IE7 会进行,IE7 会到欺诈网站数据库,查询网站是否被列入了欺诈黑名单。
经过了以上步骤,浏览器中才会显示安全锁的标志。任意一个步骤出问题,浏览器都无法建立安全链接,并最终提示“您的链接不是私密链接”。
整个HTTPS的传输过程
参考
SSL/TLS协议详解(上):密码套件,哈希,加密,密钥交换算法