Skip to content

TLS — Xray-core

تنظیمات TLS در Xray زیر streamSettings.tlsSettings قرار می‌گیرند زمانی که streamSettings.security مقدار "tls" باشد. این ساختار همچنین ECH و خانوادهٔ اثرانگشت uTLS را پوشش می‌دهد. برای REALITY، به REALITY رجوع کنید — آن یک مقدار موازی streamSettings.security با بلوک خاص خودش است.

تنظیمات TLS

فیلدنوعپیش‌فرضمقادیر مجازتوضیحات
allowInsecureboolfalsetrue | falseرد کردن بررسی گواهی سرور. فقط برای آزمایش استفاده کنید — پیکربندی‌های تولید هرگز نباید این را تنظیم کنند.
certificates[]*TLSCertConfig[][TLSCertConfig]گواهی‌های سرور (ورودی) یا پین‌کردن CA مورد اعتماد (خروجی). چند ورودی انتخاب مبتنی بر SNI را در ورودی فعال می‌کند.
serverNamestring(inferred)<hostname>نام سرور مورد انتظار. در خروجی، SNI ارسالی و مقداری که در برابر گواهی برگ سرور تأیید می‌شود. در ورودی، SNI استفاده‌شده زمانی که ACME یک گواهی تأمین می‌کند.
alpn*StringList["h2", "http/1.1"]<ALPN string>فهرست مذاکرهٔ پروتکل لایهٔ برنامه، که به همتا پیشنهاد می‌شود.
enableSessionResumptionboolfalsetrue | falseفعال کردن از سرگیری نشست TLS با تیکت (سمت کلاینت).
disableSystemRootboolfalsetrue | falseنادیده گرفتن مجموعه CA ریشهٔ سیستم‌عامل. وقتی true باشد، فقط ورودی‌های `certificates` (در حالت `verify`) پذیرفته می‌شوند.
minVersionstring1.21.0 | 1.1 | 1.2 | 1.3حداقل نسخهٔ قابل قبول TLS.
maxVersionstring1.31.0 | 1.1 | 1.2 | 1.3حداکثر نسخهٔ قابل قبول TLS.
cipherSuitesstring(library default)<comma-separated cipher list>بازنویسی فهرست مجموعه‌رمزها. از نام‌های سبک OpenSSL استفاده می‌کند (مثلاً `TLS_AES_128_GCM_SHA256:...`). توجه: برای TLS 1.3 نادیده گرفته می‌شود — فقط انتخاب رمز 1.2 قابل پیکربندی است.
fingerprintstring(unset)chrome | firefox | safari | edge | 360 | qq | ios | android | random | randomizedاثرانگشت کلاینت‌هلوی uTLS. کل شکل ClientHello را هدایت می‌کند (مجموعه‌رمزها، افزونه‌ها، الگوریتم‌های امضا) — فیلد صریح `cipherSuites` را بازنویسی می‌کند.
rejectUnknownSniboolfalsetrue | falseورودی — اتصال‌های TLS که SNI آن‌ها با هیچ‌یک از گواهی‌های پیکربندی‌شده تطبیق نمی‌کند را رد کن.
curvePreferences*StringList(library default)X25519 | P-256 | P-384 | P-521 | X25519MLKEM768بازنویسی فهرست ترجیح منحنی تبادل کلید. ترتیب مهم است.
masterKeyLogstring(unset)<file path>مسیر سبک SSLKEYLOGFILE برای ضبط کلیدهای TLS (رمزگشایی Wireshark). در تولید فعال نکنید.
pinnedPeerCertSha256string(unset)<base64 SHA-256>پین‌کردن گواهی همتا. فقط خروجی — اتصال رد می‌شود اگر SHA-256 گواهی برگ تطبیق نکند.
verifyPeerCertByNamestring(unset)<hostname>وقتی تنظیم شود، تطبیق Subject CN/SAN گواهی همتا با این نام را به‌جای `serverName` تأیید کن. زمانی مفید است که SNI با نام گواهی متعارف متفاوت باشد (تنظیمات سبک REALITY).
verifyPeerCertInNames[]string[][<hostname>]شکل فهرستی `verifyPeerCertByName` — هر نامی در فهرست قابل قبول است.
echServerKeysstring(unset)<base64 ECHConfigList>ورودی — مجموعه کلید ECH سرور.
echConfigListstring(unset)<base64 ECHConfigList>خروجی — فهرست پیکربندی ECH پین‌شده. وقتی تنظیم نشود، ECH از طریق جست‌وجوی DNS رکورد HTTPS به‌طور خودکار کشف می‌شود.
echForceQuerystring(unset)hkdf | dnsمکانیسم کشف خاص ECH را اجبار کن. خالی به آبشار پیش‌فرض رجوع می‌کند.
echSockopt*SocketConfig(unset)SocketConfigگزینه‌های سوکت اعمال‌شده به درخواست DNS کشف ECH.

منبع: infra/conf/transport_internet.go:646-667 · ثابت‌شده در v1.260327.0 (d2758a0)

certificates[]

فیلدنوعپیش‌فرضمقادیر مجازتوضیحات
certificateFilestring(unset)<PEM file path>مسیر یک فایل PEM گواهی. متقابلاً منحصر با `certificate`.
certificate[]string(unset)[<PEM line>]PEM گواهی درون‌خطی به‌صورت آرایه‌ای از رشته‌ها (یک عنصر در هر خط، یا کل PEM به‌عنوان یک عنصر).
keyFilestring(unset)<PEM file path>مسیر فایل PEM کلید خصوصی.
key[]string(unset)[<PEM line>]PEM کلید خصوصی درون‌خطی.
usagestringenciphermentencipherment | verify | issueنقش این گواهی: `encipherment` (گواهی سرور)، `verify` (CA مورد اعتماد برای تأیید همتا)، `issue` (CA استفاده‌شده برای صدور گواهی‌های per-connection در برخی حالت‌های ارجاع).
ocspStaplinguint643600<seconds>هر چند ثانیه یک‌بار staple OCSP تازه شود. 0 غیرفعال می‌کند.
oneTimeLoadingboolfalsetrue | falseگواهی و کلید را یک‌بار در راه‌اندازی بخوان به‌جای هر بارگذاری مجدد. وقتی از `certificate`/`key` درون‌خطی استفاده شود به‌طور خودکار true می‌شود (هیچ مسیری برای بارگذاری مجدد وجود ندارد).
buildChainboolfalsetrue | falseاگر PEM ارائه‌شده فقط برگ را داشته باشد، CAهای میانی را به‌صورت خودکار دریافت کن تا یک زنجیرهٔ کامل ساخته شود.

منبع: infra/conf/transport_internet.go:578-587 · ثابت‌شده در v1.260327.0 (d2758a0)

مثال‌ها

خروجی — تأیید در برابر فروشگاه ریشهٔ سیستم، اجبار TLS 1.3، پین کردن اثرانگشت chrome:

json
{
  "streamSettings": {
    "security": "tls",
    "tlsSettings": {
      "serverName": "example.com",
      "alpn": ["h2", "http/1.1"],
      "minVersion": "1.3",
      "maxVersion": "1.3",
      "fingerprint": "chrome"
    }
  }
}

ورودی — ارائهٔ یک گواهی Let's Encrypt:

json
{
  "streamSettings": {
    "security": "tls",
    "tlsSettings": {
      "serverName": "example.com",
      "certificates": [
        {
          "certificateFile": "/etc/ssl/cert.pem",
          "keyFile": "/etc/ssl/key.pem",
          "usage": "encipherment",
          "ocspStapling": 3600
        }
      ],
      "rejectUnknownSni": true
    }
  }
}

خروجی با گواهی پین‌شده (قفل کردن روی یک SHA-256 خاص):

json
{
  "streamSettings": {
    "security": "tls",
    "tlsSettings": {
      "serverName": "example.com",
      "pinnedPeerCertSha256": "<base64-SHA256-of-leaf-cert>"
    }
  }
}

نکات

  • fingerprint همان uTLS است — کل ClientHello را برای تقلید از مرورگر انتخاب‌شده بازنویسی می‌کند. وقتی تنظیم شود، cipherSuites، curvePreferences و minVersion/maxVersion عمدتاً نادیده گرفته می‌شوند چون uTLS خودش آن‌ها را کنترل می‌کند.
  • TLS-1.3 طبق کتابخانهٔ استاندارد Go از cipherSuites صرف‌نظر می‌کند — فقط انتخاب رمز TLS 1.2 قابل پیکربندی است. از curvePreferences برای تأثیر بر انتخاب تبادل کلید در TLS 1.3 استفاده کنید.
  • فیلد certificates[].usage حیاتی است:
    • encipherment — گواهی معمولی سرور.
    • verify — به‌عنوان ریشهٔ CA مورد اعتماد در سمت خروجی استفاده می‌شود. همراه با disableSystemRoot: true برای نادیده گرفتن مجموعهٔ سیستم‌عامل.
    • issue — برای صدور گواهی‌های per-connection در برخی حالت‌های ارجاع استفاده می‌شود (عبور MITM HTTPS).
  • verifyPeerCertByName SNI را از نام تأییدشده جدا می‌کند — در تنظیمات سبک REALITY مفید است که SNI یک سایت عمومی است اما گواهی واقعی برای سرور Xray است.
  • masterKeyLog یک کمک عیب‌یابی است؛ فرمت فایل با مشخصات SSLKEYLOGFILE که Wireshark مصرف می‌کند تطبیق می‌کند. هرگز در تولید فعال نکنید.

نکات بین‌هسته‌ای

  • sing-box از یک بلوک واحد tls: { ... } استفاده می‌کند که در هر ورودی و خروجی تعبیه می‌شود. نام فیلدها snake_case هستند (server_name, cipher_suites) و REALITY / ECH / uTLS به‌عنوان زیربلوک‌های تو در تو قرار دارند. ببینید TLS — sing-box.
  • mihomo فیلدهای TLS را مستقیماً روی هر آداپتور پراکسی پخش می‌کند — tls, sni, alpn, skip-cert-verify و غیره. هیچ بلوک TLS یکپارچه‌ای وجود ندارد. ببینید TLS — mihomo.

منبع: infra/conf/transport_internet.go:646-667 · v1.260327.0 (d2758a0)

Core Tutorial اثر Argsment