Files
3x-ui/docs/content/docs/fa/config/ssl-certificates.mdx
MHSanaei 9b91f0f42e docs: vendor the documentation site into the monorepo
Fold the standalone 3x-ui-docs project (Next.js 16 + Fumadocs, deployed to
docs.sanaei.dev) into docs/ so the panel and its documentation share a single
source of truth, the way sing-box keeps its docs in-tree. The old repo becomes
redundant and can be retired.

- Import the full site under docs/ (app, components, content, lib, public,
  scripts, config). The self-contained pnpm project sits alongside the existing
  engineering notes with no filename collisions.
- Re-point "Edit on GitHub" links from MHSanaei/3x-ui-docs to this repo's
  docs/content/docs path (docs/lib/shared.ts, docs/app/.../page.tsx).
- Add docs-ci.yml and docs-deploy.yml under .github/workflows/, scoped to
  docs/** and run with working-directory: docs, since GitHub only runs
  workflows from the repo-root .github/. deploy-static.yml's GitHub Pages
  publish (CNAME docs.sanaei.dev) carries over unchanged.

Follow-up (outside this commit): attach the docs.sanaei.dev custom domain to
this repository's Pages (or set the Vercel project's root directory to docs),
confirm the site is live from the monorepo, then delete MHSanaei/3x-ui-docs.
2026-07-07 23:07:14 +02:00

180 lines
10 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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: گواهی‌های SSL
description: دریافت و تمدید گواهی‌های TLS برای پنل و ورودی‌های 3x-ui — با منوی ACME در x-ui (دامنه یا IP خام)، گواهی wildcard از طریق Cloudflare DNS-01، یا Certbot دستی.
icon: ShieldCheck
---
یک گواهی TLS به شما امکان می‌دهد **پنل** را روی HTTPS سرویس‌دهی کنید (تا ترافیک ورود و
API شما رمزگذاری شود) و TLS را روی **ورودی‌ها** خاتمه دهید (VLESS-TLS، Trojan،
Shadowsocks-TLS و موارد مشابه). سه راه برای به‌دست‌آوردن گواهی وجود دارد:
- **منوی `x-ui`** — کلاینت داخلی [ACME](https://en.wikipedia.org/wiki/Automatic_Certificate_Management_Environment).
آسان‌ترین گزینه برای یک دامنه‌ی واحد یا یک IP خام.
- **Cloudflare DNS-01** — این هم از همان منو؛ برای گواهی‌های **wildcard** یا
زمانی که پورت 80 مسدود است / سرور پشت پراکسی Cloudflare قرار دارد لازم است.
- **Certbot دستی** — اگر ترجیح می‌دهید `acme.sh`/Certbot را خودتان مدیریت کنید.
<Callout type="info">
اگر پنل را پشت Nginx یا Caddy قرار می‌دهید، بگذارید پراکسی به‌جای شما گواهی را
مدیریت کند — به [پراکسی معکوس](/docs/operations/reverse-proxy) مراجعه کنید.
ورودی‌های [REALITY](/docs/config/reality) **هیچ** گواهی‌ای نیاز ندارند؛ آن‌ها
TLS یک سایت واقعی را قرض می‌گیرند. این صفحه برای پنل و برای ورودی‌های کلاسیک TLS است.
</Callout>
## منوی SSL در `x-ui` (Let's Encrypt)
`x-ui` را اجرا کنید و **`20` — SSL Certificate Management** را انتخاب کنید. این گزینه
[acme.sh](https://github.com/acmesh-official/acme.sh) را به کار می‌گیرد و موارد زیر را ارائه می‌دهد:
| گزینه | کاری که انجام می‌دهد |
| ------------------------------ | ------------------------------------------------------------------- |
| Get SSL (Domain) | صدور گواهی برای یک دامنه از طریق اعتبارسنجی HTTP. |
| Get SSL for IP Address | صدور یک گواهی کوتاه‌مدت (۶ روزه، با تمدید خودکار) برای یک **IP خام**. |
| Revoke | باطل‌کردن یک گواهی موجود. |
| Force Renew | تمدید همین حالا، پیش از انقضا. |
| Show Existing Domains | فهرست‌کردن گواهی‌هایی که از پیش روی سرور هستند. |
| Set Cert paths for the panel | اشاره‌دادن TLS پنل به یک گواهی صادرشده (فیلدها را برای شما تنظیم می‌کند). |
### صدور گواهی برای یک دامنه
<Steps>
<Step>
### دامنه را به سرور اشاره دهید
یک رکورد `A` (و/یا `AAAA`) برای دامنه‌ی خود بسازید که به IP عمومی این سرور
اشاره کند. تا زمانی که DNS منتشر (propagate) نشده باشد، اعتبارسنجی ناموفق خواهد بود.
</Step>
<Step>
### پورت 80 را آزاد کنید
اعتبارسنجی HTTP نیاز دارد که **پورت 80** از اینترنت در دسترس باشد و از پیش در حال
استفاده نباشد. هر چیزی را که به آن متصل است برای این مدت متوقف کنید و آن را از
[فایروال](/docs/reference/ports-firewall) عبور دهید.
</Step>
<Step>
### صادرکننده را اجرا کنید
`x-ui` ← `20` ← **Get SSL (Domain)**، سپس دامنه را وارد کنید. acme.sh گواهی را
درخواست می‌کند و آن را زیر `/root/cert/<domain>/` به‌صورت `fullchain.pem`
(زنجیره‌ی گواهی) و `privkey.pem` (کلید خصوصی) ذخیره می‌کند.
</Step>
<Step>
### آن را به پنل متصل کنید
گزینه‌ی **Set Cert paths for the panel** را انتخاب کنید تا `webCertFile` و
`webKeyFile` پر شوند و پنل راه‌اندازی مجدد شود، یا آن‌ها را خودتان در
[تنظیمات پنل](/docs/config/panel#tls) تنظیم کنید. به‌محض تنظیم‌شدن هر دو، پنل HTTPS را
سرویس‌دهی می‌کند.
</Step>
</Steps>
### صدور گواهی برای یک IP خام
دامنه‌ای ندارید؟ گزینه‌ی **Get SSL for IP Address** را انتخاب کنید تا یک گواهی
کوتاه‌مدت (با اعتبار حدود ۶ روز، که به‌صورت خودکار تمدید می‌شود) متصل به IP سرور
به‌دست آورید. برای دسترسی به پنل روی HTTPS پیش از آنکه دامنه‌ای راه‌اندازی کنید مفید است.
## Cloudflare (گواهی wildcard با DNS-01)
اعتبارسنجی DNS به‌جای پاسخ‌دادن روی پورت 80، با ساختن یک رکورد TXT ثابت می‌کند که شما
دامنه را در اختیار دارید — بنابراین **پشت پراکسی Cloudflare**، روی سرورهایی که
پورت 80 در آن‌ها مسدود است، و برای گواهی‌های **wildcard** (`*.example.com`) کار می‌کند.
DNS دامنه‌ی شما باید توسط Cloudflare مدیریت شود و به یکی از این موارد نیاز دارید:
- یک **توکن API محدودشده** با مجوز `Zone:DNS:Edit` (توصیه‌شده)، یا
- **ایمیل حساب + Global API Key**.
<Steps>
<Step>
### یک توکن API محدودشده بسازید
در داشبورد Cloudflare به **My Profile → API Tokens →
[Create Token](https://dash.cloudflare.com/profile/api-tokens)** بروید، قالب
**Edit zone DNS** را انتخاب کنید، آن را به zoneای که برایش گواهی صادر می‌کنید محدود
کنید و آن را بسازید. توکن را کپی کنید — فقط یک‌بار نمایش داده می‌شود.
</Step>
<Step>
### صادرکننده‌ی Cloudflare را اجرا کنید
`x-ui` ← **`21` — Cloudflare SSL Certificate**. هنگام پرسش، **`t`** را برای یک
توکن API (پیش‌فرض) یا **`g`** را برای Global API Key انتخاب کنید، سپس دامنه‌ی خود را
وارد کنید (و برای Global API Key، ایمیل حساب و کلید خود را). acme.sh رکورد TXT را
می‌سازد، اعتبارسنجی می‌کند و آن را پاک‌سازی می‌کند.
</Step>
<Step>
### پنل را به آن اشاره دهید
مانند جریان دامنه، از **Set Cert paths for the panel** (منوی `20`) استفاده کنید یا
`webCertFile` / `webKeyFile` را در [تنظیمات پنل](/docs/config/panel#tls) تنظیم کنید.
</Step>
</Steps>
<Callout type="info">
یک توکن محدودشده را به Global API Key ترجیح دهید — آن فقط اجازه‌ی ویرایش DNS را روی
zoneای که انتخاب می‌کنید می‌دهد، بنابراین نشت آن نمی‌تواند به بقیه‌ی حساب Cloudflare شما دست بزند.
</Callout>
## دستی (Certbot)
اگر ترجیح می‌دهید از منو استفاده نکنید، یک گواهی را با افزونه‌ی standalone مربوط به
Certbot صادر کنید (این هم نیاز دارد که پورت 80 آزاد باشد و دامنه به سرور اشاره کند):
```bash
apt-get install certbot -y
certbot certonly --standalone --agree-tos --register-unsafely-without-email -d yourdomain.com
certbot renew --dry-run
```
Certbot گواهی را در `/etc/letsencrypt/live/yourdomain.com/` می‌نویسد
(`fullchain.pem` و `privkey.pem`). پنل را در [تنظیمات پنل](/docs/config/panel#tls) به آن
دو فایل اشاره دهید و تمدید را راه‌اندازی کنید — `certbot renew` به‌صورت پیش‌فرض روی یک
تایمر systemd اجرا می‌شود.
## استفاده از گواهی
- **پنل** — `webCertFile` (زنجیره‌ی کامل) و `webKeyFile` (کلید خصوصی) را در
[تنظیمات پنل](/docs/config/panel#tls) تنظیم کنید. برای آنکه پنل به HTTPS سوئیچ کند،
هر دو باید تنظیم شوند. گزینه‌ی منوی **`11` — View Current Settings** مسیرهای
درحال‌استفاده‌ی فعلی را چاپ می‌کند.
- **ورودی‌ها** — وقتی TLS را روی یک ورودی فعال می‌کنید، در تنظیمات TLS همان ورودی به
همان فایل‌های گواهی و کلید ارجاع دهید (یا محتوای آن‌ها را جای‌گذاری کنید). به
[ورودی‌ها](/docs/config/inbounds) و [ترابری‌ها](/docs/config/transports) مراجعه کنید.
<Callout type="warn">
گواهی‌ها منقضی می‌شوند (Let's Encrypt: ۹۰ روز؛ گواهی‌های IP: حدود ۶ روز). هم منو و هم
Certbot به‌صورت خودکار تمدید می‌کنند، اما پنل همچنان **فایل‌ها** را در مسیرهای ثابت‌شان
می‌خواند — بنابراین **در همان محل** تمدید کنید نه با جابه‌جاکردن فایل‌ها، و پنل در
راه‌اندازی مجدد بعدی‌اش گواهی جدید را برمی‌دارد. **Force Renew** (منوی `20`) یک تمدید
را به‌صورت درخواستی فعال می‌کند.
</Callout>
## گام‌های بعدی
<Cards>
<Card
title="تنظیمات پنل"
href="/docs/config/panel#tls"
description="webCertFile / webKeyFile و بقیه‌ی تنظیمات وب‌سرور."
/>
<Card
title="پراکسی معکوس"
href="/docs/operations/reverse-proxy"
description="به‌جای آن، بگذارید Nginx یا Caddy کار خاتمه‌دادن TLS را برایتان انجام دهد."
/>
<Card
title="REALITY"
href="/docs/config/reality"
description="TLS مخفیانه برای ورودی‌ها — بدون نیاز به گواهی."
/>
</Cards>