Open 3andne opened 1 year ago
谢谢大佬 Review!
关于 V3 协议这里写了一个面向普通用户的 Wiki:https://github.com/ihciah/shadow-tls/wiki/V3-Protocol
客户端发送 AppData 一定是握手正确结束,此时服务端已经证明身份。注:此处客户端并非是在第一个 AppData 处添加 HMAC,而是握手结束后的 AppData。
TLS 1.2里,server在整个握手过程中都不会发送0x17,如果我理解正确,padding是只加在0x17中,客户端在发送第一个0x17(真正的application data)时,并不知道服务器的身份。
此问题在tls 1.3中并不存在。
存在 SessionTicket 的情况下似乎会有 Server 侧主动发送的 AppData。我试了下我这边的 V3 版本在 cloud.tencent.com 是能使用的(如果服务端没能证明身份,客户端会视作连接被劫持,无法正常代理流量)。
(被 cloud.tencent.com 误导了,这个域名在海外用的CDN是支持 tls1.3 的,国内的不支持)确认问题存在。
我的想法是 ShadowTLS 后续的工作是明确这些边界,在代码中加以限制,并告知用户;但不从协议和代码上特地对 TLS1.2 做强制处理(至少要是一个可选实现),因为这样会引入非常大的复杂度。
目前在考虑的一个 idea 是利用 session id 里随机 28 byte 的末 4 byte 再携带一个签名,server 侧如果打开了 strict 开关则会去校验这个签名。这个后续会被细化为一个 V3 的扩展校验协议。 引入扩展协议会增大复杂性,同时确实无法解决没发送0x17的问题。
我这边计划是 TLS1.3 only 了。
存在 SessionTicket 的情况下似乎会有 Server 侧主动发送的 AppData
TLS 1.3设计时的目标就是把自己伪装成一个TLS w/ session resumption,所以在某些时候可能会和TLS1.3流程类似。
Hi @ihciah Just took a closer look at the v3 protocol. The idea of auth padding in application records looks awesome. This would allow the server to detect anomalies without the help of Shadowsocks and make it payload agnostic. That said, there are some issues that I feel should be pointed out.
ServerEncryptedExtension
sent to the suspect v3 client, then it has a chance to identify the server.----------------
我仔细研究了一下v3的协议,觉得有很多可取之处。特别是在0x17中使用auth padding的做法,这可以在没有Shadowsocks(或者其他协议)的帮助下监测异常,使得协议可以更通用。 但我还是发现了一些问题:
ServerEncryptedExtension
。如果墙主动探测获得的ServerEncryptedExtension
的长度永远(或大多数时候)都比一个疑似客户端收到的ServerEncryptedExtension
短4个byte,或许墙就能发现这是个client。针对这个问题的规避也导致了Restls实现的复杂性。