那些HTTPS的事儿,你知道多少?
苹果在2017年的开发者大会中已经明确说到AppStore的所有APP都必须启用ATS安全功能,启用ATS以后,明文HTTP资源加载将被屏蔽,APP需要通过HTTPS连接网络服务。
为何要使用HTTPS呢?
1.无法证明报文的完整性,所以有可能已遭篡改--可能会被劫持插入广告
2.通信使用明文,敏感信息被截取(银行卡、各种密码、手机号等)
3.不验证通信方的身份,因此可能遭遇跟伪装的服务器通信
注释:因为HTTP通过明文传输,没有经过任何安全处理,且很容易受到中间人的攻击,比如:通过重定向把客户端的请你求转到一个另外的服务器;查看客户端的敏感信息;或者偷偷修改客户端的请求/相应数据包。所以才迫切的想要引人HTTPS。
为何使用HTTPS以后能够保证传输安全呢?
HTTPS被称为Hyperttext Transfer Protocol Secure(安全的超文本传输协议)或者说HTTP over Secure Socket Layer(安全套接字层HTTP协议),实际上HTTPS协议是在HTTP协议的基础上添加了SSL(Secure Socket Layer)/TLS(Transport Layer Security)加密协议
握手流程如下:
1.客户端-->服务器 发起请求
客户端发起请求到服务器。主要参数是支持的协议版本,加密方法以及一个随机数n1;
2.服务器-->客户端 发送证书,客户端验证证书
服务器收到请求并确认加密方法,然后返回公钥,以及一个由服务器生成的随机数n2;在这个阶段iOS中的CA认证的认证的证书会自动验证,而私有的证书则需要手动验证放行,否则拒绝链接;
3.客户端-->服务器 发送消息
客户端验证证书成功后会生成第三个随机数n3,并用第2步服务器返回的证书对该随机数加密,并发送给服务器,同时也会发送一些其他信息,比如:编码信息和客户端握手结束的通知。
4.服务器-->客户端 发送信息
服务器用私钥解密后,得到客户端传来的第三个随机数n3,两端使用这三个随机数n1、n2、n3来生成Session Key。服务器想客户端发送编码信息和服务器握手结束通知。
5.完整性验证
完整性验证以后,后面的信息传输就靠这个Session key进行对称加密了。
SSL在握手的过程中主要交换了以下三个信息:
加密通信协议:就是双方商量使用哪一种加密方式,假如两者支持的加密方式不匹配,则无法进行通信。
数字证书:该证书包含了公钥等信息,一般是由服务器发给客户端,接收方通过验证这个证书是不是由信赖的CA签发,或者与本地的证书相对比,来判断证书是否可信;假如需要双向验证,则服务器和客户端都需要发送数字证书给对方验证。
三个随机数n1,n2,n3:这三个随机数构成了后续通信过程中用来对数据进行对称加密解密的对话密钥。
中间人攻击
中间人攻击是通过与客户端、服务器分别建立连接,来获得了明文的信息攻击方式。在这个过程中,客户端与服务器的通信被第三方解密、查看、修改。
为什么有些APP即便使用了HTTPS,还是会被中间人攻击呢?
基本都是因为没做客户端验证,特别是在使用未经CA认证的证书时,更容易中招。关于黑客是如何在协议握手初期劫持服务,从而实现中间人攻击,可以做如下推演:
1.黑客劫持到服务器公钥,并冒充客户端与服务器连接;
2.黑客自己生成公钥,冒充服务器公钥返回给真正的客户端;
如果客户端未做验证的话,就不会发现证书被替换,于是客户端会用黑客的公钥发送数据,黑客劫持数据后,用自己的私钥解密,查看。
由此可见,需要做好客户端验证。比如吧证书打包进APP,然后与服务器返回的证书对比验证,验证成功以后才允许连接。当然是用这种方式会导致一些问题,比如:当证书过期时APP连不上服务器,这时需要我们将新证书提前打包进APP,或者通过Socket通道从服务器传送证书进APP中,来实现无缝对接。