Files
3x-ui/docs/content/docs/fa/config/ssl-certificates.mdx
T
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

---
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>