--- title: "Websocket" draft: false weight: 4 --- 由于使用CDN中转时,HTTPS对CDN透明,CDN可以审查Websocket传输内容,而Trojan协议明文的头部特征过于明显,而TLS握手特征也很明显。为了保证Websocket传输的隐蔽和安全,默认情况下还会进行一次AES加密(混淆层)和TLS连接(双重TLS)。其中TLS用于保证传输的安全性,AES加密仅仅只是用于混淆流量。 **如果你使用的是国内的CDN,务必保证两者均开启。最坏情况下也应当保持混淆和双重TLS之一是打开的** 开启Websocket模块的客户端可以使用```obfuscation```字段开启混淆,以及使用```double_tls```启用双重TLS以确保连接安全性和隐蔽性。 混淆层使用AES-CTR-128加密方式。在每次连接开始时,客户端使用```password```作为密码,使用8字节随机salt和sha1散列算法,使用pbkdf2进行对```password```密码进行32次迭代,派生得到16字节的密钥。生成16字节的随机IV,使用AES-CTR-128对后续流量进行加密。头部的结构如下(IV和Salt是随着Payload一起发送的,避免了长度特征): ``` +----+------+-------------------+ | IV | Salt | Encrypted Payload | +----+------+-------------------+ | 16 | 8 | Variable | +----+------+-------------------+ ``` 服务端得到IV和Salt之后用同样方法生成密钥,进行解密。 注意,这层加密作用仅仅是增加熵,混淆流量特征,而不是保护数据安全。它不保证数据完整性和身份认证,因此可能遭受中间人攻击和重放攻击。如果CDN不可信,或者遭受了基于HTTPS劫持的中间人攻击,应启用双重TLS保证数据传输安全。 如果使用了双重TLS,握手造成的延迟可能略有增加,但是只要开启```session_reuse```,```session_ticket```复用TLS连接,以及开启```mux```启用TLS多路复用,只会刚刚开启Trojan-Go时察觉明显的延迟。 协议栈如下: |协议 |备注 | |-----------------|----------| |真实流量| |simplesocks |如果使用mux| |smux |如果使用mux| |trojan| |TLS| |如果开启双重TLS| |混淆层 |如果开启混淆| |Websocket| |TLS| |TCP|