我眼中的HTTPS

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/nhgfd/article/details/79959448

目录

前言

笔者由于项目中经常用到抓包工具,在抓包的时候Https的请求总是抓取不到,于是就研究了下https。这种网络基础方面的知识不记下来太容易遗忘了,所以写篇文章,总结下学到的以及用到的,文章如果写得有不对的地方,欢迎各位老司机指正。

什么是HTTPS

先了解下官方对HTTPS,TLS,对称加密,非对称加密的定义:

HTTPS是一种通过计算机网络进行安全通信的传输协议。HTTPS经由HTTP进行通信,但用TLS来加密数据包,HTTPS开发的主要目的,是提供对网站服务器的身份认证,保护交换数据的隐私与完整性。————维基百科
TLS是传输层加密协议,前身是SSL协议,用于在两个通信应用程序之间提供保密性和数据完整性。—————百度百科
对称加密即加密和解密使用同一个密钥,虽然对称加密破解难度很大,但由于对称加密需要在网络上传输密钥和密文,一旦被黑客截取很容易就能被破解,因此对称加密并不是一个较好的选择。————百度百科
非对称加密 即加密和解密使用不同的密钥,分别称为公钥和私钥。我们可以用公钥对数据进行加密,但必须要用私钥才能解密。在网络上只需要传输公钥,私钥保存在服务端用于解密公钥加密后的密文。————百度百科

总而言之,https就是给http套了个ssl的外壳,它在http跟tcp中间插入了ssl,从而尽量保证通信在安全以及正确的通道下进行。HTTP+加密+认证+完整性保护=HTTPS。

https的通信过程

在回顾https基础知识的过程中,笔者看过一篇非常有趣的文章,他讲往服务器发送数据以及从服务器接受数据的行为比喻成了有一只信鸽在你与服务器之前传送消息,并且把客户端和服务器以及窃取信息这三者的关系比喻成了恋爱中的双方和第三方情敌的关系,新奇不已。有兴趣的朋友可以访问以下链接:
https://mp.weixin.qq.com/s/aRs6Ah1cIwAVjXR8hK-OCg
总结Https 的握手过程,大致分为如下几步

  1. 客户端通过发送Client Hello 报文开始SSL通信。报文中包含客户端支持的SSL的指定版本、加密组件列表(所使用的加密算法及密钥长度等)。
  2. 服务器可进行SSL通信,会以ServerHello报文作为应答。和客户端一样,在报文中包含SSL版本以及加密组件。服务器的加密组件内容是从接收到的客户端加密组件内筛选出来的。
  3. 之后服务器发送Certificate报文。报文中包含公开密钥证书。
  4. 最后服务器发送ServerHelloDone报文通知客户端,最初阶段的SSL握手协商部分结束。
  5. SSL第一次握手结束之后,客户端以Client Key Exchange报文作为回应。报文中包含通信加密中使用的一种被称为Pre-master secret的随机密码串。该报文已用步骤3中的公开密钥进行加密。
  6. 接着客户端继续发送Change Cipher Spec报文。该报文会提示服务器,在此报文之后的通信会采用Pre-master secret密钥加密。
  7. 客户端发送Finish报文。该报文包含连接至今全部报文的整体校验值。这次握手协商是否能够成功,要以服务器是否能够正确解密该报文作为判定标准。
  8. 服务器同样发送Change Cipher Spec报文。
  9. 服务器同样发送Finished报文。
  10. 服务器和客户端的Finished报文交换完毕之后,SSL连接就算建立完成。当然,通信会受到SSL的保护。从此处开始进行应用层协议的通信,即发送Http请求。
  11. 应用层协议通信,即发送HTTP响应。
  12. 最后由客户端断开连接。断开连接时,发送close_notify报文,之后再发送TCPFIN报文来关闭与TCP的通信。
    在以上流程中,应用层发送数据时会附加一种叫做MAC的报文摘要。MAC能够查知报文是否遭到篡改,从而保护报文的完整性。
    ——————图解HTTP

Charlest等抓包工具的使用

中间人攻击是通过拦截正常的网络通信数据,并进行数据篡改和嗅探,而通信双方毫不知情。
Charlest就是使用这种方式来来实现抓包的。
市面上的抓包工具操作基大同小异。以Mac下抓包Android 手机Https为例,(抓包http省略第一步)

  1. 首先将证书导入到Android 设备上
    这里写图片描述
    2.电脑端Charlest设置HTTPS抓包配置端口
    菜单栏 Proxy –> ProxySetting
    这里写图片描述
    3.手机端配置代理。一般情况下长按或点击wifi旁边的箭头,跳转到配置界面。
    这里写图片描述
    按照以上的操作,结合我们的理论分析,我们有理由相信,我们可以抓到大部分的数据包,但是结果呢?下面分别是小米6跟魅族MX5手机上抓包微博接口的测试。
    小米6
    魅族MX5
    可以发现我们正确配置之后,无法再小米6上实现抓包,所有的请求都无法正常的响应,并且提示Client closed the connection before request was mad.Possibly the SSL certificate was rejected。
    而魅族MX5上所有请求开起来是一切正常的。到底什么原因导致了这样事情的发生呢?

无法抓包的原因及解决办法

原因

出现上述问题的原因来自于Android 7.0(API24)以上的新功能,有一个名为“Network Security Configuration”的新安全功能。
https://developer.android.google.cn/training/articles/security-config.html
官方文档的意思很明确,我再7.0之后不再支持你用户自己添加的证书啦,想要信任的话,请你改代码吧。
这里写图片描述

解决办法1

1.你需要在清单文件中添加一个条目指向你的网络配置文件,类似这样

<?xml version="1.0" encoding="utf-8"?>
<manifest ... >
    <application android:networkSecurityConfig="@xml/network_security_config"
                    ... >
        ...
    </application>
</manifest>

假设您要连接到使用自签署 SSL 证书的主机,或者连接到其 SSL 证书是由您信任的非公共 CA(如公司的内部 CA)签发的主机。
res/xml/network_security_config.xml:


<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config>
        <domain includeSubdomains="true">example.com</domain>
        <trust-anchors>
            <certificates src="@raw/my_ca"/>
        </trust-anchors>
    </domain-config>
</network-security-config>

应用可能需要信任系统不信任的附加 CA,出现此情况的原因可能是系统还未包含此 CA,或 CA 不符合添加到 Android 系统中的要求。应用可以通过为一个配置指定多个证书源来实现此目的。

res/xml/network_security_config.xml:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config>
        <trust-anchors>
            <certificates src="@raw/extracas"/>
            <certificates src="system"/>
        </trust-anchors>
    </base-config>
</network-security-config>

当然还有更多详细的操作,具体就需要通过访问官方文档去详细探究了。

解决办法2

2.你可以选择一款低于android 7.0 的手机进行HTTPS的抓包测试。

采用双向验证的应用

如果按照如上的设置及修改还是无法抓取到想要抓取的数据包,考虑可能碰上了需要双向验证的app,在通信过程中,服务器会验证app的公钥证书,这时候,就无法采用中间人攻击的方式进行抓包了。

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页