前置知识
对称加密
- 对称加密算法是应用较早的加密算法,又称为共享密钥加密算法。在对称加密算法中,使用的密钥只有一个,发送和接收双方都使用这个密钥对数据进行加密和解密。这就要求加密和解密方事先都必须知道加密的密钥。
- 数据加密过程:在对称加密算法中,数据发送方将明文(原始数据)和加密密钥一起经过特殊加密处理,生成复杂的加密密文进行发送
- 数据解密过程:数据接收方收到密文后,若想读取原数据,则需要使用加密使用的密钥及相同算法的逆算法对加密的密文进行解密,才能使其恢复成可读明文
非对称加密
- 非对称加密算法,又称为公开密钥加密算法。与对称加密算法不同,非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(privatekey)。公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密;如果用私有密钥对数据进行加密,那么只有用对应的公开密钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。
- 如果使用 公钥 对数据 进行加密,只有用对应的 私钥 才能 进行解密。如果使用 私钥 对数据 进行加密,只有用对应的 公钥 才能 进行解密。
- 例子:甲方生成 一对密钥 并将其中的一把作为 公钥 向其它人公开,得到该公钥的 乙方 使用该密钥对机密信息 进行加密 后再发送给甲方,甲方再使用自己保存的另一把 专用密钥 (私钥),对 加密 后的信息 进行解密。
HTTPS概念
- HTTP + SSL / TLS ,原本 HTTP 的数据是直接丢给TCP进行处理发送的,而 HTTPS中是将HTTP数据扔给 SSL / TLS 加密处理,然后再由 SSL / TLS 扔给 TCP,对方收到后也是 TCP 扔给 SSL / TLS 进行解密,最后扔给 HTTP。现在像是在这两者之间插入了一层,所以一般叫 SSL / TLS 为安全层 (SSL 和 TLS 的区别其实是 TLS 是 SSL 的升级版,一开始 HTTPS 刚出来的时候安全层是 SSL,后来协议标准化,就在 SSL 的基础上进行优化修改并且将其改名为 TLS)
通信流程
- 加密雏形
- HTTPS 解决数据传输安全问题的方案是使用加密算法,具体来说是混合加密算法,也就是对称加密和非对称加密的混合使用。如果只用对称加密方式,双方要使用相同的密钥,那就要在传输数据之前先由一方把密钥传给另一方,那么在此过程中密钥就很有可能被截获,这样一来加密的数据也会被轻松解密,因此需要确保密钥在传输过程中的安全。非对称加密传输密钥,对称加密传输通信内容
-
在上述过程中,客户端在拿到服务器的公钥后,会生成一个随机码 (用 KEY 表示,这个 KEY 就是后续双方用于对称加密的密钥),然后客户端使用公钥把 KEY 加密后再发送给服务器,服务器使用私钥将其解密,这样双方就有了同一个密钥 KEY,然后双方再使用 KEY 进行对称加密交互数据。在非对称加密传输 KEY 的过程中,即便第三方获取了公钥和加密后的 KEY,在没有私钥的情况下也无法破解 KEY (私钥存在服务器,泄露风险极小),也就保证了接下来对称加密的数据安全
-
完整通信流程
- 1、客户端请求 HTTPS 网址,然后连接到 server 的 443 端口 (HTTPS 默认端口,类似于 HTTP 的80端口)
- 2、采用 HTTPS 协议的服务器必须要有一套数字 CA (Certification Authority)证书,证书是需要申请的,并由专门的数字证书认证机构(CA)通过非常严格的审核之后颁发的电子证书 (当然了是要钱的,安全级别越高价格越贵)。颁发证书的同时会产生一个私钥和公钥。私钥由服务端自己保存,不可泄漏。公钥则是附带在证书的信息中,可以公开的。证书本身也附带一个证书电子签名,这个签名用来验证证书的完整性和真实性,可以防止证书被篡改。
- 3、服务器响应客户端请求,将证书传递给客户端,证书包含公钥和大量其他信息,比如证书颁发机构信息、使用者(公司)信息和证书有效期、签名算法等(Chrome 浏览器点击地址栏的锁标志再点击证书就可以看到证书详细信息)
- 4、客户端解析证书并对其进行验证。如果证书不是可信机构颁布,或者证书中的域名与实际域名不一致,或者证书已经过期,就会向访问者显示一个警告,由其选择是否还要继续通信
- 如果证书没有问题,客户端就会从服务器证书中取出服务器的公钥A。然后客户端还会生成一个随机码 KEY,并使用公钥A将其加密
- 5、客户端把加密后的随机码 KEY 发送给服务器,作为后面对称加密的密钥
- 6、服务器在收到随机码 KEY 之后会使用私钥B将其解密。经过以上这些步骤,客户端和服务器终于建立了安全连接,完美解决了对称加密的密钥泄露问题,接下来就可以用对称加密进行通信了
- 7、服务器使用密钥 (随机码 KEY)对数据进行对称加密并发送给客户端,客户端使用相同的密钥 (随机码 KEY)解密数据
- 8、接下来双方使用对称加密进行传输所有数据
SSL / TLS 握手
重要概念
- 数字证书 (digital certificate):在非对称加密通信过程中,服务器需要将公钥发送给客户端,在这一过程中,公钥很可能会被第三方拦截并替换,然后这个第三方就可以冒充服务器与客户端进行通信,这就是传说中的“中间人攻击”(man in the middle attack)。解决此问题的方法是通过受信任的第三方交换公钥,具体做法就是服务器不直接向客户端发送公钥,而是要求受信任的第三方,也就是证书认证机构 (Certificate Authority, 简称 CA)将公钥合并到数字证书中,然后服务器会把公钥连同证书一起发送给客户端,私钥则由服务器自己保存以确保安全
- 数字签名 (digital signature):这个概念很好理解,其实跟人的手写签名类似,是为了确保数据发送者的合法身份,也可以确保数据内容未遭到篡改,保证数据完整性。与手写签名不同的是,数字签名会随着文本数据的变化而变化。具体到数字证书的应用场景,数字签名的生成和验证流程如下:
- 服务器对证书内容进行信息摘要计算 (常用算法有 SHA-256等),得到摘要信息,再用私钥把摘要信息加密,就得到了数字签名
- 服务器把数字证书连同数字签名一起发送给客户端
- 客户端用公钥解密数字签名,得到摘要信息
- 客户端用相同的信息摘要算法重新计算证书摘要信息,然后对这两个摘要信息进行比对,如果相同,则说明证书未被篡改,否则证书验证失败
- 密码规范和密码组合 (CipherSpecs 和 CipherSuites):通信双方在安全连接中所使用的算法必须符合密码安全协议的规定,CipherSpecs 和 CipherSuites 正好定义了合法的密码算法组合。CipherSpecs 用于认证加密算法和信息摘要算法的组合,通信双方必须同意这个密码规范才能进行通信。而 CipherSuites 则定义了 SSL / TLS 安全连接中所使用的加密算法的组合,该组合包含三种不同的算法
- 握手期间所使用的的密钥交换和认证算法 (最常用的是 RSA 算法)
- 加密算法 (用于握手完成后的对称加密,常用的有 AES、3DES等)
- 信息摘要算法 (常用的有 SHA-256、SHA-1 和 MD5 等)
握手流程
- 在上面完整通信流程第一步之后,请求服务器是需要有一个通信的连接,TLS 握手是启动 HTTPS 通信的过程,类似于 TCP 建立连接时的三次握手,目的是建立安全连接:
- 商定双方通信所使用的的 TLS 版本 (例如 TLS1.0, 1.2, 1.3等等)
- 确定双方所要使用的密码组合
- 客户端通过服务器的公钥和数字证书上的数字签名验证服务端的身份
- 生成会话密钥,该密钥将用于握手结束后的对称加密
- 1、"client hello"消息:客户端通过发送"client hello"消息向服务器发起握手请求,该消息包含了客户端所支持的 TLS 版本和密码组合以供服务器进行选择,还有一个"client random"随机字符串
- 2、"server hello"消息:服务器发送"server hello"消息对客户端进行回应,该消息包含了数字证书,服务器选择的密码组合和"server random"随机字符串
- 3、验证:客户端对服务器发来的证书进行验证,确保对方的合法身份,具体有检查数字签名、验证证书链、检查证书的有效期、检查证书的撤回状态 (撤回代表证书已失效)
- 4、"premaster secret"字符串:客户端向服务器发送另一个随机字符串"premaster secret (预主密钥)",这个字符串是经过服务器的公钥加密过的,只有对应的私钥才能解密
- 5、使用私钥:服务器使用私钥解密"premaster secret"
- 6、生成共享密钥:客户端和服务器均使用 client random,server random 和 premaster secret,并通过相同的算法生成相同的共享密钥 KEY
- 7、客户端就绪:客户端发送经过共享密钥 KEY加密过的"finished"信号。
- 8、服务器就绪:服务器发送经过共享密钥 KEY加密过的"finished"信号。
- 9、达成安全通信:握手完成,双方使用对称加密进行安全通信。
部分个人理解
- 不能直接发公钥-->用CA证书-->为了防止证书被篡改-->用摘要算法加密证书内容然后用私钥加密-->客户端先用公钥解密得到hash串,再用同样的摘要算法加密证书内容对比hash串就可以认证证书是否被篡改和认证证书的可信度
- 客户端生成随机A明文发服务器,服务器生成随机B明文连同证书(含有公钥)发客户端,客户端有公钥了,生成并加密一个随机C给服务器,服务器私钥解密,这时候两边都有ABC,用握手第一步约定的密码组合算法进行加密,两边都能得到传输信息的对称密钥,这样就可以加密通信内容进行安全通信了