V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
acess
V2EX  ›  Android

HTTPS 抓包,即便安装成系统证书,好像还是不太行

  •  
  •   acess · 2021-04-22 14:25:58 +08:00 · 12790 次点击
    这是一个创建于 1315 天前的主题,其中的信息可能已经有所发展或是发生改变。
    楼主试了 MuMu 模拟器( Android 6.0 )。

    按照网上的教程(比如 mitmproxy 提供的教程,虽然我用的不是 mitmproxy ):
    (1)WiFi 设置里,需要设置代理服务器为手动,填入抓包软件开的代理 IP 和端口。
    (2)需要把抓包软件的根 CA 证书转成 PEM 格式,然后用 openssl x509 -subject_hash_old 查到类似 1234abcd 的哈希值,再把 PEM 格式的证书重命名成 1234abcd.0 、丢到 /system/etc/security/cacerts/下面。
    (3)最后重启模拟器。

    一套折腾下来,结果怎么样呢?

    很有意思:
    (1)用自带浏览器打开 https www . ipip . net
    报错,证书错误;
    (2)打开 https www . grc . com
    欸,这回不报错啦,正常打开。
    点开证书信息,也是抓包软件的 MITM 证书,绿色对勾,有效。
    (3)清空自带浏览器的数据,再试试?
    还是老样子,并没有什么变化……

    我看了模拟器里现存的其他证书,貌似里面的内容大概是这样:
    (大概就那个意思)
    -- BEGIN CERTIFICATE --
    一坨 base64
    -- END CERTIFICATE --
    ( openssl x509 转出来的 PEM 证书只含有上面的部分,不含有下面的部分)
    人类可读的,文本格式的证书信息,包括主题、密钥等等
    SHA1 Fingerprint

    于是我就用 openssl x509 照葫芦画瓢了一下……然后,不出意外地……
    情况还是那个情况,并没有什么变化。


    那么,换个模拟器,比如 Android studio 自带的 AVD ?

    楼主之前折腾过一个 Android 11 的 AVD,用 github 上 newbit1 的 rootAVD 脚本给它刷了 magisk,然后安装 edxposed,都是正常的。
    然后,楼主试了 magisk 官方仓库里的 movecert 模块。先在设置里安装为用户证书,然后重启,等着 movecert 把用户证书转换成系统证书。
    结果呢?

    模拟器它直接黑屏了……压根开不了机……adb shell 都进不去

    我不服气,强关掉模拟器,重启它,按音量-按钮进了安全模式,然后发现,/data/adb/modules/movecert/system/etc/security/cacerts/里面的证书文件(文件名就是上面看到过的 1234abcd.0 )貌似不是 base64 的,而是二进制的;而我自己用 openssl 转出来的 PEM 是 base64 的。于是我就用 cat 命令把它覆盖掉,(当然,magisk 模块的 disable 要删掉)再重启。

    不出意外地……嗯……还是黑屏了……还是 adb shell 都进不去


    楼主表示自己已经凌乱了……
    第 1 条附言  ·  2021-04-22 17:12:28 +08:00
    11 楼提醒了证书过期时间太长,会违反 Chromium 证书寿命政策的问题。处理了这个问题,MuMu 模拟器的自带浏览器看上去就不会再报证数错误了。至于之前为啥有的网站报错,有的网站不报错……额,这个我也说不清(也许是抓包软件生成的服务器证书时间在 Chromium 证书寿命政策改变的时间点前吧)。
    第 2 条附言  ·  2021-04-25 02:21:02 +08:00
    Fiddler 是不支持 HTTP/2 的,这也有可能导致抓包失败。
    lusi1990
        1
    lusi1990  
       2021-04-22 15:28:01 +08:00
    巧了 我也最近捣鼓了装证书的问题。
    用 mitmproxy 的证书 ,直接装到 mumu 里面可以正常抓包。 用 fiddler 就不行 ,我也按照网上的方法装到系统证书也不行。后面就没捣鼓了
    Telegram
        2
    Telegram  
       2021-04-22 15:31:19 +08:00
    抓包这个还是苹果简单,只要证书搞好,VPN 一挂起就都能抓了。
    安卓感觉就算你搞好了,很多 APP 能检测到你抓包,直接拒绝通信。
    KuroNekoFan
        3
    KuroNekoFan  
       2021-04-22 15:32:18 +08:00   ❤️ 1
    不考虑模拟器的问题,android7 以上不能通过信任个人签发证书来调试 https 了
    ly841000
        4
    ly841000  
       2021-04-22 15:37:09 +08:00
    不要自己转换, 先安装用成用户证书, 再移动到系统证书目录
    Jirajine
        5
    Jirajine  
       2021-04-22 15:39:23 +08:00 via Android   ❤️ 1
    两种办法:
    1. 把安装上的根证书移动到系统证书目录。需要 root,需要 app 没有使用 ssl pinning 。
    2. tcpdump 抓包,劫持 libssl 函数,打出 ssl keylog,然后用 Wireshark 解密查看。
    napsterwu
        6
    napsterwu  
       2021-04-22 15:41:47 +08:00 via iPhone
    太长了,首先建议参考 Charles 或者 fiddler 。全程不需要使用 OpenSSL 命令,一般证书系统 ui 就可以装 pem 格式的证书。比如文件管理器直接打开证书,或者设置里面有“从 sd 卡安装证书”。安装完之后是在用户空间的,有 movecert 或者 MagiskTrustUserCerts 的话重启一下就可以了。
    brader
        7
    brader  
       2021-04-22 15:42:06 +08:00
    咦,怎么我使用没有问题呀,我目前在用两款,MuMu 模拟器 和 夜神模拟器,都没有问题
    napsterwu
        8
    napsterwu  
       2021-04-22 15:43:07 +08:00 via iPhone
    不过尽管安装到系统证书,微信 7 之后小程序还是抓不了的,不知道有没有大佬可以指点一下
    brader
        9
    brader  
       2021-04-22 15:43:27 +08:00
    对了,抓包工具我是用的 Charles
    mx8Y3o5w3M70LC4y
        10
    mx8Y3o5w3M70LC4y  
       2021-04-22 15:50:43 +08:00 via Android
    我用的 fiddler+真机抓 HTTPS 的包。先从 fiddler 导出证书,放到手机根目录。手机设置里搜索 ca 证书,安装根目录的证书。fiddler 设置-https 里先 trust,再选中 capture https traffic 。就可以了
    mengyx
        11
    mengyx  
       2021-04-22 15:55:58 +08:00 via Android   ❤️ 1
    之前处理过一样的问题 供楼主参考一下 https://blog.mengyx.cn/p/fiddler-android-packet-caputre/
    MaxLi77
        12
    MaxLi77  
       2021-04-22 15:56:20 +08:00
    证书啥的基本不好用。。。真机 xposed + justtrustme 类插件
    acess
        13
    acess  
    OP
       2021-04-22 16:00:24 +08:00
    @Telegram 我看 JustTrustMe 这个 Xposed 模块里提到,有些 app 用了 Public Key (Certificate) Pinning——感觉就是类似 SSH 那样,不是信任 CA 来验证,而是 app 里直接指定一个服务器公钥。这种情况貌似确实比较麻烦,导了 CA 也不能解决,只能是 xposed 或者改包了吧。

    @KuroNekoFan 这个我之前也看到了,按理说 MuMu 是 Android 6,所以不需要折腾系统证书也能达到类似的效果吧……

    我主要感觉奇怪的是,为什么同一个 app 下(自带浏览器),不同网站的情况也不一样……这太诡异了
    再有就是为啥 Android 11 的 AVD 用了 movecert 就会无法正常启动……这也很诡异
    acess
        14
    acess  
    OP
       2021-04-22 16:06:55 +08:00
    @MaxLi77 额,按理说我现在有了带 edxp 的 AVD,也可以直接上 justtrustme……不过我感觉 AVD 还是有点卡,尤其是 GPU 硬件加速好像还是开不了,按照官方文档里说的,win 上可以从 host 模式调到 angle_indirect 模式,现在好像这个设置是无效的。再有就是 justtrustme 这类 xposed 模块虽然可以搞定 ssl pinning,也总有照顾不到的死角( hook 不到的代码)吧……
    acess
        15
    acess  
    OP
       2021-04-22 16:07:34 +08:00
    @MaxLi77 准确地讲,host 模式是有 GPU 加速的,但是有的时候渲染不正确。
    acess
        16
    acess  
    OP
       2021-04-22 16:53:18 +08:00
    @mengyx 额,证书过期时间这个,我确实没注意。重新生成证书后,貌似 MuMu 里自带浏览器就不会报证书错误了。至于之前为什么不同网站,有的报错有的不报错,我不知道为什么,也不想管了……
    SvenWong
        17
    SvenWong  
       2021-04-22 17:16:24 +08:00   ❤️ 1
    Android 10 下,Charles+VirtaulXposed+JustTrustMe 可以正常抓包,只测试过这些版本,其他不知道
    MaxLi77
        18
    MaxLi77  
       2021-04-22 23:08:32 +08:00   ❤️ 1
    @acess justtrustme 的确存在死角,但是已经把安装系统证书的角落都 cover 了
    Rocketer
        19
    Rocketer  
       2021-04-23 01:08:29 +08:00 via iPhone
    app 开发者为何不只信任自己的证书,非得信任所有的系统证书呢?那样不就彻底防止中间人了吗?

    不做移动端开发,不懂瞎问,别笑
    q197
        20
    q197  
       2021-04-23 09:55:00 +08:00
    @Rocketer 因为一般开发 app 直接请求 https 就行了,证书校验都是系统(可能还有用的网络请求库)自动校验的,对开发者来说调用 http 和 https 的 api 没什么区别。
    tangmanger
        21
    tangmanger  
       2021-04-23 15:08:36 +08:00
    JustTrustMe +fiddler 抓 http 包爽的一匹
    newmlp
        22
    newmlp  
       2021-04-23 18:07:58 +08:00
    如果 app 用了 ssl pinning 是需要其他 hack 的方法的
    acess
        23
    acess  
    OP
       2021-04-25 02:18:46 +08:00   ❤️ 1
    @lusi1990 搜了一下,Fiddler 好像不支持 HTTP/2
    acess
        24
    acess  
    OP
       2021-04-25 23:19:18 +08:00   ❤️ 1
    @mengyx 啊,我在 Fiddler 5.0 上试了,不过我把 fiddler.certmaker.GraceDays 和 fiddler.certmaker.ValidDays 都设成正整数了,而不是负数,负数好像会生成还没生效的证书。
    mengyx
        25
    mengyx  
       2021-04-26 00:23:03 +08:00
    @acess 哦哦 抱歉 博客第二种设置方式写错了 确实应该写正数
    mengyx
        26
    mengyx  
       2021-04-26 00:24:28 +08:00
    @mengyx 我自己设置的时候写的正数 后来写下来的时候可能没注意
    MrWhite
        27
    MrWhite  
       2021-04-26 10:20:38 +08:00
    抓包的时候。打开软件配置好代理后,打开 App 的话。 有些 App 会一直 loading... 然后关了抓包软件或者代理,就可以进入 App 了? 这是什么情况哈? 我记得以前在网上看到 说 SSL 有一种貌似就是方抓包的功能? 有佬给解答吗
    azhangbing
        28
    azhangbing  
       2021-04-26 17:02:53 +08:00
    @tangmanger okhttp 混淆了你就 get 不到 sslfactory 方法了
    acess
        29
    acess  
    OP
       2021-04-26 17:06:55 +08:00   ❤️ 1
    @MrWhite
    抓包一直 loading,不抓包就正常,那应该就是抓包的情况下不能正常连接吧。不好是啥情况……有可能是证书验证有关的问题,比如 SSL pinning ;也有可能是其他原因,比如有些应用强制要求 HTTP/2,然后 Fiddler 目前就不支持 HTTP/2 。也许还有更多预想不到的情况……

    还有,其实配置了代理,应用也可能不理睬的;甚至可能同一个应用内,也可能出现有些请求走代理、有些不走的情况。

    至于“方便抓包的功能”……我搜了一下,大概是 NSS Key Log ?好像可以设置环境变量,然后让浏览器自己把密钥 log 下来。
    还有楼上 @Jirajine 提到的“劫持 libssl 函数,打出 ssl keylog”,我搜了一下,有个项目 frida-sslkeylog,不过我还没试过。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1036 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 20:13 · PVG 04:13 · LAX 12:13 · JFK 15:13
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.