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

https 加密的问题

  •  1
     
  •   ileeoyo · 2020-06-18 17:38:36 +08:00 · 4515 次点击
    这是一个创建于 1628 天前的主题,其中的信息可能已经有所发展或是发生改变。

    请问个 https 加密的问题。 我抓包发现 https 的包,里面 user-agent 和域名部分是明文的,其他的内容是加密的。 请问一下 https 加密了哪些内容,换句话说,在没有中间人攻击的前提下,可以通过抓包获取 https 中的哪些信息?

    第 1 条附言  ·  2020-06-19 08:54:41 +08:00

    这是抓包的情况,比较疑惑的是,除了host,为什么还要明文的user-agent 20200619084827.png

    第 2 条附言  ·  2020-06-19 09:42:58 +08:00

    感觉楼下给出的意见,已经wireshark抓包,确实在tls client hello阶段有明文的域名,可以用作上网行为分析。后来data传输是全加密的

    第 3 条附言  ·  2020-06-19 09:47:23 +08:00

    本次迷惑行为是因为Charles http代理引起。一直只是简单使用代理,没有对http代理有更深入的了解。还需继续学习

    42 条回复    2020-11-29 23:17:10 +08:00
    BrettD
        1
    BrettD  
       2020-06-18 17:42:34 +08:00
    Aliencn
        2
    Aliencn  
       2020-06-18 18:08:26 +08:00
    你自己不都已经通过抓包看出来了?
    leafre
        3
    leafre  
       2020-06-18 18:38:02 +08:00
    获取不到信息,能获取到还叫 SSL
    hatebugs
        4
    hatebugs  
       2020-06-18 18:41:08 +08:00
    show your pcap
    unixeno
        5
    unixeno  
       2020-06-18 20:58:41 +08:00 via Android   ❤️ 1
    会加密所有 http 的内容
    开 sni 扩展之后会在 ssl 握手的时候带上域名,不然服务器不知道要给你谁的证书
    supermoonie
        6
    supermoonie  
       2020-06-18 21:47:35 +08:00 via iPhone
    顶多能看到 CONNECTING 这一行,剩下的全部加密
    flynaj
        7
    flynaj  
       2020-06-18 22:27:27 +08:00 via Android
    域名是可以看到的,要匹配证书,user-agent 看不到。
    zzetao
        8
    zzetao  
       2020-06-18 23:05:59 +08:00
    HTTPS 是在 应用层 (HTTP) 与 传输层 (TCP) 之间架了一层 TLS/SSL,加密内容是 HTTP 所有内容。
    除了 TCP/IP 的数据包,想象一下,如果 TCP/IP 都加密了,那路由器等等怎么找到目标 IP/端口 去传输数据?
    ysc3839
        9
    ysc3839  
       2020-06-19 06:27:19 +08:00 via Android   ❤️ 1
    整个 HTTP 协议都是加密的,只能获取 TLS 协议的一些信息,比如 SNI 、证书。
    ileeoyo
        10
    ileeoyo  
    OP
       2020-06-19 08:55:29 +08:00
    @flynaj 是我姿势不对吗?怎么看到了明文的 user-agent
    ileeoyo
        11
    ileeoyo  
    OP
       2020-06-19 08:56:03 +08:00
    @BrettD 谢谢,我看一下 sni 的问题
    ileeoyo
        12
    ileeoyo  
    OP
       2020-06-19 08:56:40 +08:00
    @Aliencn 主要是看到了明文的 user-agent 比较奇怪,按理说应该看不到
    ileeoyo
        13
    ileeoyo  
    OP
       2020-06-19 08:58:14 +08:00
    @leafre 可以获取到域名啊,这也可以做上网行为分析。比如我有一个路由器的管理权,我想知道除了域名其他的还有没有能获取的
    ileeoyo
        14
    ileeoyo  
    OP
       2020-06-19 08:58:31 +08:00
    @hatebugs append 了
    ileeoyo
        15
    ileeoyo  
    OP
       2020-06-19 09:00:19 +08:00
    @zzetao 目前域名是可以获取的
    nieqibest
        16
    nieqibest  
       2020-06-19 09:01:49 +08:00 via Android
    我猜楼主不会科学上网
    no1xsyzy
        17
    no1xsyzy  
       2020-06-19 09:04:19 +08:00   ❤️ 1
    草,生了出来
    CONNECT 是通过 HTTP 协议实现的代理协议的谓语,而不是 HTTPS 协议的谓语
    200 的状态描述也是 Connection established 而不是 OK
    ileeoyo
        18
    ileeoyo  
    OP
       2020-06-19 09:09:45 +08:00
    @nieqibest 不要盲猜,要是能答疑解惑就多谢帮忙,不要说些与话题无关的话
    monkeyWie
        19
    monkeyWie  
       2020-06-19 09:11:32 +08:00   ❤️ 1
    那是因为你用的 http 代理抓的包,正常是没有 CONNECT 请求的,这个是和代理服务器的握手
    illl
        20
    illl  
       2020-06-19 09:12:46 +08:00 via iPhone   ❤️ 1
    请在 Wireshark 下抓 https 的包
    ileeoyo
        21
    ileeoyo  
    OP
       2020-06-19 09:14:39 +08:00
    @monkeyWie 这是用 http 代理抓包的原因吗?我用 wireshark 试试
    arloor
        22
    arloor  
       2020-06-19 09:23:55 +08:00
    你这是在 connect 连代理,练完之后传输的才是被 http over tls 的东西,也就是一串乱码

    要理解这个东西,你去搜下 http connect 方法就行。

    需要自成体系的学习,咋遇到个问题上 V2EX 呢
    qwerthhusn
        23
    qwerthhusn  
       2020-06-19 09:30:24 +08:00   ❤️ 3
    代理服务器而已,想要理解 TLS 的数据包

    去 Wireshark 抓包去看,不要经过代理

    https://tls13.ulfheim.net/
    https://tls13.ulfheim.net/
    这两个网址,作者做的挺有意思,图示全程分析了 tls 握手的每一步中的每一个字节是什么意思
    smallpython
        24
    smallpython  
       2020-06-19 09:34:38 +08:00
    问题是个好问题, 楼主你不要在意有些莫名其妙的回答
    而且我遇到过抓包工具自动读取系统私钥把包解密出来再呈现在屏幕上, 让当时的我以为加密了也能看见明文.......
    sujin190
        25
    sujin190  
       2020-06-19 09:35:19 +08:00
    这不是连接你代理服务器的信息么,不明文你咋代理连接
    ileeoyo
        26
    ileeoyo  
    OP
       2020-06-19 09:38:08 +08:00
    @qwerthhusn 感谢感谢,我已经 wireshark 抓包看了
    caola
        27
    caola  
       2020-06-19 09:41:53 +08:00
    HTTP/3 和 ESNI 已经在路上了,DNSsec/DoT/DoH 也在慢慢得到支持
    monkeyWie
        28
    monkeyWie  
       2020-06-19 09:44:02 +08:00
    @ileeoyo 是的,用 wireshark 就看不到了,但是 tls client hello 里还是会有 SNI 扩展暴露域名,不过现在好像有 ESNI 来做加密了
    holyzhou
        29
    holyzhou  
       2020-06-19 09:53:27 +08:00
    @qwerthhusn 两个地址重复的 请问另一个地址是什么?
    ileeoyo
        30
    ileeoyo  
    OP
       2020-06-19 10:32:42 +08:00
    @smallpython 楼上很多人还是给了很多好的意见,不过确实也有人回复和话题不相关。有时确实在不熟悉的地方有些疑惑,帖子出来以后别人搜索也有个好的借鉴
    ileeoyo
        31
    ileeoyo  
    OP
       2020-06-19 10:34:58 +08:00
    @caola doh/dot 目前也还没广泛支持,我也在持续关注,毕竟我目前的网络环境就有 dns 劫持的问题,太难受了
    ileeoyo
        32
    ileeoyo  
    OP
       2020-06-19 10:35:27 +08:00
    @qwerthhusn 感谢,我去看看
    leafre
        33
    leafre  
       2020-06-19 10:37:36 +08:00
    @ileeoyo host 确实要暴露,要去 dns 取 ip
    ileeoyo
        34
    ileeoyo  
    OP
       2020-06-19 10:37:50 +08:00
    @arloor 只是一时很迷惑不知道从何搜起,比如这里你给了关键词 http connect 去搜索学习就快得多了。也给后来的人一些借鉴吧
    ileeoyo
        35
    ileeoyo  
    OP
       2020-06-19 10:40:05 +08:00
    @leafre dns 可以用 doh 解决,只是目前 tls 的握手阶段,sni 会暴露域名
    leafre
        36
    leafre  
       2020-06-19 10:52:36 +08:00
    @ileeoyo ESNI
    no1xsyzy
        37
    no1xsyzy  
       2020-06-19 17:55:01 +08:00
    @smallpython #24 不对啊,这应该是不可能的。TLS 是在用户态每个应用独立实现的,握手产生的一次性密钥应该不会出现在系统里(当然,系统可能会自带一些库,但内容是在进程里的)。
    而系统内能读到的是公开的证书,包含的公钥也是无法单方面解密的。
    你指的可能是自动往系统内插根证书?这是提权操作,即使没有让你亲手操作也是很明确地提示你这一操作破坏了你机器上 HTTPS 的完整性。
    smallpython
        38
    smallpython  
       2020-06-22 09:45:15 +08:00
    @no1xsyzy 我理解你只要有私钥就可以解密吧, 一般不是存在系统的某一个文件夹下嘛(具体是哪个我也不知道....)
    no1xsyzy
        39
    no1xsyzy  
       2020-06-22 10:21:28 +08:00
    @smallpython #38 因为你说的是私钥,这是非对称加密的术语,所以我认为你是指 TLS 层握手前已经确定的非对称密钥对中的私钥。这个私钥只存在于服务器上,不存在于你本地。对应的公钥则附在证书内分发,一般与域名绑定。也就是说,私钥基本固定到域名,拥有特定私钥即可向任何人伪装这些域名身份。
    而且即使拥有私钥也是无法旁观者的,因为非对称加密的效率是比较低的,所以目前来说非对称加密是用来安全地交换一个一次性密钥的。一旦交换完成,这一密钥只存在于每个客户端 /浏览器的用户空间内。所以你必须通过中间人攻击的方法,在两侧使用不同但中间人均知晓的一次性密钥,每次中间人均先解密再加密。
    smallpython
        40
    smallpython  
       2020-06-22 11:30:41 +08:00
    @no1xsyzy 服务器发给我的数据包我不是也要用本地的私钥来解密吗?你的意思是这个私钥每次都是重新生成且存在浏览器的内存中的吗?我一直以为是存在某一个文件里, 是固定的, 除非手动删除再重新生成, 不然不会变.....
    no1xsyzy
        41
    no1xsyzy  
       2020-06-22 11:51:45 +08:00
    @smallpython #40 本地没有私钥,只有公钥(通过证书链分发,存储于内存或长期存储(根证书,或者一些应用用于证书固定))和对称密钥( nonce,Number ONCE,存储于内存,每次握手时生成)。
    nonce 不分公私,两边是相同的。
    nonce 是每次握手时重新生成的,除了客户端侧生成、通过非对称传递的随机数以外,服务器侧也会每次生成随机数参与 nonce 的生成,避免客户端实现不完全导致的安全性丧失。具体技术上似乎有三个随机数参与 nonce 生成。

    我觉得提示了并且被你主观忽略了是有可能的。仅仅上述业余的安全知识就够人吃一壶的了。
    weifan
        42
    weifan  
       2020-11-29 23:17:10 +08:00
    所以最后结论是啥?都加密了哪些🤣
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3709 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 04:28 · PVG 12:28 · LAX 20:28 · JFK 23:28
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.