Https原理总结
为什么需要HTTPS
一句话总结:Http协议无法保证信息系统的安全CIA三个特性要求。
- http在数据传输过程中是明文的,数据有中间人被窃取的风险,违背了Confidentiality保密性原则
- 数据被窃取之后中间人可以肆意修改、替换数据冒充真实客户和服务器通讯,违背了Integrity完整性原则
- 服务器收到数据后,也无法确定数据有没有被修改或替换,是不是来源真实的客户,当然也就无法保证Availability可用性
HTTPS解决的问题
第一、数据加密问题
由于网络传输过程中,很难保证中间不被窃取,那么就需要保证消息的私密性,这里就需要用到加密算法。加密算法一般分为 对称加密 和 非对称加密 两类。对称加密和非对称加密优缺点。
对称加密
对称加密又叫共享秘钥加(解)密,指的是通讯双方约定使用同一个密钥进行加解密。客户端通过密钥对明文加密,服务端收到密文后拿同一密钥进行解密。
至此,http协议中数据的私密性算是解决了,但是缺点也很明显:私密性全靠这个共享密钥安全来保证的,而且这个共享密钥客户端和服务端都要知道,假设这时候客户端和服务器之间有第三方进行暗中拦截,那么这个密钥如何传输才安全呢,这时候非对称加密就登场了。
非对称加密
非对称加密指的是密钥从单个密钥变为一个公钥、私钥对。公钥可以对外暴露,而私钥只有自己可见。公钥和私钥都可以加密,但是公钥加密只能由私钥解密,私钥加密只能由公钥来解密。由于客户端和服务端不再共享同一个密钥,那么密钥泄露的可能性就降低到了一半。
服务端用自己的私钥加密数据传递给客户端,客户端用服务端的公钥解密;客户端使用服务端的公钥加密,服务端用自己的私钥解密。
到目前,客户端发给服务端是安全的。但是服务端发给客户端加密信息仍然有被劫持的风险(服务端公钥谁都可以拿到)和后续被篡改的风险,比如在真实的客户端和服务端之间如果有一个中间人,那么就会变成下面这个样子。
究其原因还是服务端的Public Key本身的安全性和传递过程中的安全性问题。为了解决这个问题就要引入CA和SSL证书。
第二、公钥安全性问题
公钥的安全性需要通过CA发型SSL证书来保证。网络中如果任意两方需要建立信任,那么必须借助第三方可信机构,CA就是这样的机构。
通过CA发型SSL证书目的在于让客户端能够在权威机构的帮助下能够鉴定出服务端公钥是否真实可靠,有没有经过什么掉包的情况。
公钥安全性保障依赖于操作系统或者浏览器的可信程度,通过内置受信任的CA根证书可以确保服务器证书是否是一个可信任CA颁发的。
浏览器在获取到服务器证书后的验证过程:
- 浏览器根据证书中的签发机构、域名、有效期等信息来匹配内置的CA根证书,如果匹配不上,浏览器就会报错,说明当前连接服务器发来的证书是不可信的
- 如果匹配上,就用CA根证书的公钥去解密服务器证书里面的加密部分,解密后得到证书的明文部分(包含、hash签名算法、公钥)和hash签名值部分
- 客户端对证书明文部分重新进行hash签名,然后与证书中签名值对比,如果一致证明证书可信,那么就可以获得服务器公钥进行后续的对称密钥协商、加密过程了
SSL/TLS四次握手
1 客户端发出请求ClientHello
客户端首先向服务器443端口发出通信请求,请求中包含客户端支持的协议版本、加密算法列表、密钥长度等信息
2 服务器发出回应ServerHello
服务端在回应报文时会确认协议版本、加密组件、加密算法和服务器证书、ServiceHelloDone回应
3 客户端认证及交换密钥
- 客户端执行证书认证过程:验证证书的合法性(颁发证书的机构是否合法,证书中的域名是否与访问域名一致等),如果证书不受信任浏览器会给出不受信提示
- 客户端发送Client Key Exchange报文。内容是用服务端公钥加密过的Pre-master secret的随机密码串(对称密钥)
- 客户端发送Change Cipher Spec报文。告知服务器之后的通信会采用Pre-master secret密钥加密
- 客户端发送Finished报文,内容是采用约定好的hash摘要算法对握手消息进行摘要,并使用Pre-master secret对消息进行加
4 服务端认证回应发送Findshed报文
-
服务端使用自己的私钥解密取出Pre-master secret,然后使用Pre-master secret解密出握手信息以及握手消息的摘要,并验证是否握手信息是否一致
-
服务端同样发送Change Cipher Spec报文,告知客户端后续通讯会采用Pre-master secret密钥加密
-
服务端同样发送Finished报文给客户端
两次Finished报文交换完毕后,SSL连接就算建立完成。通信会受到SSL的保护。从此处开始的HTTP请求内容都已经是加密格式了。
总结
HTTS主要三个基本过程
-
客户端获取并验证服务端公钥
-
双方协商生成会话密钥-对称密钥
-
双方采用会话密钥-对称密钥进行加密通信
其中:过程1的安全性主要由CA及其SSL证书颁发机制来保证,过程2的安全性主要由非对称加密算法和签名算法来保证。过程3的安全性是由过程1和过程2保证的。