پرش به مطلب اصلی

TlsClient

TlsClient یک wrapper سمت client برای TLS است و روی BoringSSL موجود در سورس WaterWall ساخته شده است. این نود payload خام را از نود قبلی می‌گیرد، آن را به TLS record برای نود بعدی تبدیل می‌کند و در مسیر برگشت TLS recordها را decrypt می‌کند.

جایگاه رایج:

HttpClient -> TlsClient -> TcpConnector
SomeTunnel -> TlsClient -> TcpConnector

این نود TLS واقعی انجام می‌دهد و برای شبیه‌تر شدن به رفتار Chrome شکل handshake را تنظیم می‌کند. با این حال، TLS را خودش روی socket نمی‌فرستد؛ برای حمل byteها معمولا بعد از آن TcpConnector قرار می‌گیرد.

نمونه تنظیم

{
"name": "tls-client",
"type": "TlsClient",
"settings": {
"sni": "example.com",
"verify": true,
"ech-sni-trick": "example.net",
"x25519mlkem768": true
},
"next": "tcp-connector"
}

تنظیمات

گزینهاجباریپیش‌فرضتوضیح
sniبله-SNI مقصد. مقدار خالی یا حذف‌شده reject می‌شود.
verifyخیرtrueکنترل verify شدن certificate chain با CA bundle داخلی
ech-sni-trickخیر-ساخت fake ClientHello و قرار دادن آن داخل GREASE encrypted_client_hello برای هماهنگی با ترفندهای packet-side
x25519mlkem768خیرtrueتبلیغ گروه hybrid X25519MLKEM768 برای رفتار نزدیک‌تر به Chrome
اطلاع

فیلدی به نام alpn در بعضی بخش‌های سورس دیده می‌شود، اما create path فعلی مقدار JSON برای ALPN را استفاده نمی‌کند. ALPN داخلی فعلی روی رفتار Chrome-like متمرکز است.

رفتار handshake

در upstream Init، نود state TLS می‌سازد، SNI را تنظیم می‌کند، init را به نود بعدی می‌فرستد و بلافاصله SSL_connect() را اجرا می‌کند تا ClientHello و بایت‌های handshake تولید شوند. اگر transport بعدی مثل TcpConnector هنوز در حال connect باشد، می‌تواند این بایت‌ها را طبق رفتار خودش buffer کند.

Est در WaterWall یعنی transport زیرین برقرار شده است، نه اینکه handshake TLS حتما تمام شده باشد. اگر payload زود برسد، TlsClient آن را تا پایان handshake نگه می‌دارد.

verify certificate

اگر verify روی true بماند:

  • peer verification فعال است.
  • CA bundle داخلی WaterWall بارگذاری می‌شود.
  • خطای chain می‌تواند handshake را fail کند.

اگر verify را false کنید:

  • handshake TLS همچنان واقعی است.
  • BoringSSL peer verification را انجام نمی‌دهد.
  • این حالت برای تست یا مسیرهای کنترل‌شده است؛ برای اتصال به سرویس عمومی معمولا توصیه نمی‌شود.

ech-sni-trick

ech-sni-trick برای هماهنگی با ترفندهای IpManipulator طراحی شده است. outer SNI همان settings.sni می‌ماند، اما یک fake ClientHello با hostname تنظیم‌شده ساخته و در payload GREASE ECH قرار داده می‌شود تا بایت‌هایی که TLS hash می‌کند با بایت‌های روی wire هماهنگ باشند.

API داخلی

این نود API زیر را می‌پذیرد:

generateTlsHello:<sni>

خروجی، buffer خام ClientHello براساس تنظیمات instance است. اگر x25519mlkem768 غیرفعال باشد، ClientHello کوچک‌تر ولی کمتر شبیه Chrome فعلی می‌شود.