V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
feast
V2EX  ›  程序员

cloudflare 是如何转发 HTTPS 流量的?

  •  
  •   feast · Nov 15, 2017 via Android · 7366 views
    This topic created in 3098 days ago, the information mentioned may be changed or developed.
    众所周知,HTTPS 流量对观察者来说是完全加密的内容,那么 cf 是如何甄别不同域名的连接的呢?是通过 TLS handshake 的证书获取域名等信息?之后的转发又如何实现的呢?客户端肯定不会额外支持 HTTP CONNECT 形成的隧道,而且 cf 也采用的不支持 connect 操作的 nginx 进行反向代理
    19 replies    2017-11-16 06:03:29 +08:00
    Lentin
        2
    Lentin  
       Nov 15, 2017
    sniproxy
    ryd994
        3
    ryd994  
       Nov 15, 2017 via Android   ❤️ 1
    @also24
    @Lentin
    想多了
    cloudflare 是 CDN,必须 mitm 破 TLS 才行
    企业用户也有 keyless 的,只给协商后的对称参数,不给原始私钥,但 cloudflare 还是破了 TLS 的

    怎么 mitm ? cloudflare 有你域名的 DNS 管理权限,利用这个权限找证书商签就行。普通用户给多域名。加钱单域名。
    ewBuyVmLZMZE
        4
    ewBuyVmLZMZE  
       Nov 15, 2017 via iPhone
    这块涉及到 Openresty,ssl_certificated_By_lua
    also24
        5
    also24  
       Nov 15, 2017   ❤️ 1
    @ryd994 #3
    不确定是楼主描述问题还是别的地方出了差错……

    我感觉你在描述的是:

    CDN-浏览器 间之所以能在不持有源站的 https 证书的情况下,就建立起 https 连接。
    是因为 Cloudflare 持有相应域名的管理权( or cname 这种变相管理权),于是 Cloudflare 可以申请到相应的 DV 证书,从而建立连接。


    而我和 @Lentin #2 说的 SNI 所解决的问题是:

    在 Cloudflare 的同一台 CDN 节点上,可能同时有多个客户的域名指向这台机器。
    那么机器上的 “ CDN 程序” 是如何在 TLS 握手之前,就判断出丢给自己的请求,是针对哪个域名,从而选择相应的 TLS 密钥 /证书 。
    Lentin
        6
    Lentin  
       Nov 15, 2017   ❤️ 1

    看看证书大体就知道了吧……
    feast
        7
    feast  
    OP
       Nov 15, 2017 via Android
    @also24 不大可能是 SNI,因为 SNI 可以透传 SSL V 破 N
    feast
        8
    feast  
    OP
       Nov 15, 2017 via Android
    @Lentin 恐怕没这么简单
    wql
        9
    wql  
       Nov 15, 2017 via Android
    @feast 根据官方描述就是这么简单
    LanFomalhaut
        10
    LanFomalhaut  
       Nov 15, 2017   ❤️ 1
    那么 cf 是如何甄别不同域名的连接的呢?是通过 TLS handshake 的证书获取域名等信息?
    [SNI]


    之后的转发又如何实现的呢?
    访客-(HTTPS)-节点(为节点上的证书 节点自然可以解密请求的数据) - 源服务器(是否开启 SSL 均不影响)
    gamexg
        11
    gamexg  
       Nov 15, 2017   ❤️ 1
    https://blog.cloudflare.com/introducing-universal-ssl/

    > 那么 cf 是如何甄别不同域名的连接的呢?是通过 TLS handshake 的证书获取域名等信息?
    是的, 排除 windows xp+ie/chrome 之外的环境都支持 SNI,ssl 握手包内包含了域名,cf 可以直接得到。

    > 之后如何进行的?
    cloudflare 给每个网站签发了 ssl 证书,然后直接用自己的证书回应浏览器即可。网站服务器本身有没有 ssl 只是影响 cf 回源时是否使用 https。

    另外 cloudflare 还提供使用客户证书的功能,但是需要付费。
    feast
        12
    feast  
    OP
       Nov 15, 2017 via Android
    @ryd994 MITM 这个问题,假设我用的证书不是这个域名的呢
    feast
        13
    feast  
    OP
       Nov 15, 2017 via Android
    @wql 还是有点感觉不太像 SNI 哈哈,只能另外想办法证明一下
    feast
        14
    feast  
    OP
       Nov 15, 2017 via Android
    @also24 其实简单说 就是 1 cf 的节点是否是 https 透明代理,
    2 https 数据加密,哪儿能看到域名
    就这么多,感觉对 HTTPS 了解太少了,最近得恶补一下相关知识 Orz
    Lentin
        15
    Lentin  
       Nov 15, 2017
    @feast https 证书里的域名是明文的,只不过看不到 uri 跟内容而已……
    Lentin
        16
    Lentin  
       Nov 15, 2017   ❤️ 1
    如图
    wql
        17
    wql  
       Nov 16, 2017 via Android
    @feast 如果是透明代理,就不要大费周章去签一个证书出来了。说白了,这只能是反向代理了……
    dndx
        18
    dndx  
       Nov 16, 2017
    CF 不支持 TLS 的透明代理。
    msg7086
        19
    msg7086  
       Nov 16, 2017
    #12 @feast 你用的证书是什么并不重要。cloudflare 管辖你的域名,所以他可以为你申请任意证书。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   5740 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 150ms · UTC 07:24 · PVG 15:24 · LAX 00:24 · JFK 03:24
    ♥ Do have faith in what you're doing.