最近空闲下来,研究了一下HTTPS的原理,写篇博客分享出来。
首先要明白的是HTTPS = HTTP + SSL;
SSL就是对HTTP请求的数据加密、校验、确保数据完整性的过程。
HTTPS的加密包括了非对称加密和对称加密两种方式,首先使用非对称加密传递证书、随机数;最后通过客户端和服务端的随机数生成协商秘钥;协商秘钥就是对称加密的秘钥。
1、客户端向服务器发出证书请求,请求的数据包含客户端使用的协议版本号、支持的加密算法、客户端生成的随机数A和一些其他必要的数据。
2、服务器接收到请求后会验证是否支持客户端使用的协议、加密算法等等。如果不支持,取消此次连接。如果支持,生成一个随机数B,并向客户端发送证书和随机数B;
3、客户端在接受到服务器返回到证书后,会对证书进行验证;一般大公司使用的证书都是第三方可信数字证书机构CA颁发的证书,首先,我们需要去数字证书机构的可信证书列表里去验证服务器发来的证书是否可信,如果不可信,在App中的时候,此次连接就取消了。如果在浏览器中,会弹出一个提示框,提示证书不可信,提示你是否信任证书继续操作。这个时候你一定要慎重了,有可能你信任了证书,而导致你的数据被别人拦截了。如果证书可信,或者不可信的证书被你信任了,接下来就要验证证书是否有效了。以AF为例,AF封装了AFSeacurityPolicy提供了三种验证策略:
一、AFSSLPinningModelNone:这个是默认模式,不做证书验证,只要判断了证书可信(无论是CA签发的还是自己安装的可信的证书),即表示证书有效。
二、AFSSLPinningModelCertificate:这是一个比较严格的证书验证模式;要求工程里事先要添加从服务器copy过来的证书,然后判断工程里的证书是否完全与服务器传过来的证书一致(包括公钥、域名、有效期、颁发机构等等),如果一致则表示证书有效。
三、AFSSLPinningModePublicKey:这是一个介于上面两种验证模式之间的模式;这种模式下只验证证书的公钥是否一样,而不管域名、有效期等其他数据。如果公钥一致,则表示证书有效。
在验证了证书可信且有效以后,这个时候客户端就认为发送消息的是服务器。然后进行接下来的通信;生成第三个随机数C并用服务器发来的证书的公钥加密返回给服务器。
4、服务器接收到数据后用自己的私钥解密,得到随机数C。这个时候客户端和服务器都有了三个随机数,并使用这个三个随机数生成一个协商秘钥,接下来的HTTPS通信中就会用这个协商秘钥进行对称加密,HTTPS请求就算建立了。
HTTPS在受到中间代理拦截的时候,比如Charles。Charles会拦截服务器和客户端之间的请求和响应。在拦截到服务器返回的证书以后,会把证书换成自己的证书,然后再把数据转发给客户端。这个时候如果客户端信任了Charles的证书,Charles就可以实现抓包的功能了。
以上都是本人个人观点,如果有纰漏,敬请斧正。