Files
trojan-go/docs/content/developer/websocket.md
T
2020-04-23 12:58:24 -04:00

41 lines
2.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
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|