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

cloudflare 是如何转发 HTTPS 流量的?

  •  
  •   feast · 2017-11-15 23:00:06 +08:00 via Android · 6745 次点击
    这是一个创建于 2564 天前的主题,其中的信息可能已经有所发展或是发生改变。
    众所周知,HTTPS 流量对观察者来说是完全加密的内容,那么 cf 是如何甄别不同域名的连接的呢?是通过 TLS handshake 的证书获取域名等信息?之后的转发又如何实现的呢?客户端肯定不会额外支持 HTTP CONNECT 形成的隧道,而且 cf 也采用的不支持 connect 操作的 nginx 进行反向代理
    19 条回复    2017-11-16 06:03:29 +08:00
    Lentin
        2
    Lentin  
       2017-11-15 23:04:15 +08:00
    sniproxy
    ryd994
        3
    ryd994  
       2017-11-15 23:09:37 +08:00 via Android   ❤️ 1
    @also24
    @Lentin
    想多了
    cloudflare 是 CDN,必须 mitm 破 TLS 才行
    企业用户也有 keyless 的,只给协商后的对称参数,不给原始私钥,但 cloudflare 还是破了 TLS 的

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

    我感觉你在描述的是:

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


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

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

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


    之后的转发又如何实现的呢?
    访客-(HTTPS)-节点(为节点上的证书 节点自然可以解密请求的数据) - 源服务器(是否开启 SSL 均不影响)
    gamexg
        11
    gamexg  
       2017-11-15 23:34:57 +08:00   ❤️ 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
       2017-11-15 23:36:49 +08:00 via Android
    @ryd994 MITM 这个问题,假设我用的证书不是这个域名的呢
    feast
        13
    feast  
    OP
       2017-11-15 23:38:44 +08:00 via Android
    @wql 还是有点感觉不太像 SNI 哈哈,只能另外想办法证明一下
    feast
        14
    feast  
    OP
       2017-11-15 23:44:22 +08:00 via Android
    @also24 其实简单说 就是 1 cf 的节点是否是 https 透明代理,
    2 https 数据加密,哪儿能看到域名
    就这么多,感觉对 HTTPS 了解太少了,最近得恶补一下相关知识 Orz
    Lentin
        15
    Lentin  
       2017-11-15 23:46:31 +08:00
    @feast https 证书里的域名是明文的,只不过看不到 uri 跟内容而已……
    Lentin
        16
    Lentin  
       2017-11-15 23:47:50 +08:00   ❤️ 1
    如图
    wql
        17
    wql  
       2017-11-16 00:12:36 +08:00 via Android
    @feast 如果是透明代理,就不要大费周章去签一个证书出来了。说白了,这只能是反向代理了……
    dndx
        18
    dndx  
       2017-11-16 04:22:43 +08:00
    CF 不支持 TLS 的透明代理。
    msg7086
        19
    msg7086  
       2017-11-16 06:03:29 +08:00
    #12 @feast 你用的证书是什么并不重要。cloudflare 管辖你的域名,所以他可以为你申请任意证书。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2917 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 03:52 · PVG 11:52 · LAX 19:52 · JFK 22:52
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.