Plesk

نصب SSL در Plesk با Let's Encrypt و رفع خطاهای رایج

نصب SSL در Plesk با افزونه Let's Encrypt چند کلیک بیشتر نیست: از بخش SSL/TLS Certificates دامنه گواهی رایگان را می گیرید و ریدایرکت HTTPS را روشن می کنید. اگر خطای Authorization failed آمد، علت تقریبا همیشه DNS یا مسیر .well-known/acme-challenge است که Let's Encrypt نمی تواند از اینترنت باز کند.

نوشته تیم فنی پیکوهاستبه روزرسانی: ۱۶ مهر ۱۴۰۵۸ دقیقه مطالعه

برای نصب SSL در Plesk به دامنه ای نیاز دارید که رکورد A آن به IP همین سرور اشاره کند و پورت 80 از بیرون باز باشد. بعد از این دو شرط، گواهی رایگان Let's Encrypt را از بخش SSL/TLS Certificates همان دامنه می گیرید. این مقاله برای Plesk Obsidian نوشته شده است و اگر نام منوها در پنل شما فرق دارد، نسخه پنل یا قالب آن را بررسی کنید. نام دقیق دکمه ها را در مستندات Plesk می بینید. بیشتر مقاله به خطاهایی می پردازد که موقع صدور یا تمدید گواهی می بینید.

پیش از نصب SSL در Plesk این چهار چیز را بررسی کنید

Let's Encrypt قبل از صدور گواهی، مالکیت دامنه را با یک درخواست HTTP روی خود سرور شما چک می کند. پس اگر یکی از این موارد درست نباشد، صدور شکست می خورد:

  • رکورد A دامنه (و رکورد A برای www) باید به IP سرور Plesk اشاره کند. اگر DNS دامنه جای دیگری است، باید همان جا تغییر کند.
  • پورت 80 باید از اینترنت باز باشد. فایروال سرور یا فایروال سرویس دهنده VPS نباید آن را ببندد.
  • افزونه Let's Encrypt باید نصب باشد. در بخش Extensions پنل دنبالش بگردید. در نسخه های جدیدتر Obsidian همین کار با افزونه SSL It هم انجام می شود.
  • دامنه باید روی همین سرور میزبانی شود و رکورد AAAA اشتباه نداشته باشد (توضیح آن پایین تر آمده است).

اگر دسترسی root دارید، وجود افزونه را از ترمینال هم می توانید ببینید:

plesk bin extension --list | grep -i -E "letsencrypt|sslit"
plesk bin extension --install letsencrypt

نصب گواهی Let's Encrypt در Plesk قدم به قدم

  1. وارد Plesk شوید و از منوی کناری Websites & Domains را بزنید.
  2. روی دامنه مورد نظر، SSL/TLS Certificates را باز کنید.
  3. گزینه Install a free basic certificate provided by Let's Encrypt را انتخاب کنید.
  4. ایمیل خودتان را وارد کنید. هشدارهای انقضا و مشکل تمدید به همین آدرس می رسد.
  5. تیک Include a "www" subdomain را بزنید تا www هم پوشش داده شود. اگر رکورد www ندارید، این تیک را نزنید وگرنه صدور شکست می خورد.
  6. اگر ایمیل دامنه را هم روی همین سرور دارید، گزینه امن کردن webmail را بزنید و Get it free را کلیک کنید.

بعد از چند ثانیه پیام موفقیت و تاریخ انقضا را می بینید. گواهی Let's Encrypt معمولا ۹۰ روزه است و Plesk آن را قبل از انقضا خودکار تمدید می کند.

فعال کردن ریدایرکت HTTP به HTTPS

صدور گواهی به تنهایی کاربران را به HTTPS نمی برد. از Websites & Domains، دامنه را باز کنید و وارد Hosting Settings شوید. این دو گزینه را بررسی کنید:

  • SSL/TLS support باید فعال باشد.
  • Permanent SEO-safe 301 redirect from HTTP to HTTPS باید تیک داشته باشد.

بعد از ذخیره، نسخه http سایت را در مرورگر باز کنید. اگر وردپرس دارید و صفحه ها هنوز منابع http بارگذاری می کنند، راه حل mixed content در وردپرس را ببینید. اگر مرورگر حلقه ریدایرکت نشان داد، سراغ رفع ERR_TOO_MANY_REDIRECTS بروید.

خطای Could not issue a Let's Encrypt certificate چه معنی دارد

متن کامل خطا معمولا این است: Could not issue a Let's Encrypt SSL/TLS certificate for example.com. Authorization for the domain failed. جزئیات آن، یعنی خط بعدی، علت واقعی را می گوید. جدول زیر رایج ترین حالت ها را به ترتیب تکرار نشان می دهد:

پیام در جزئیات خطاعلت محتملچک کردن
Invalid response ... 404فایل challenge پیدا نشد یا دامنه روی سرور دیگری استDNS و مسیر .well-known/acme-challenge
Timeout during connectپورت 80 بسته است یا IP اشتباه استفایروال و رکورد A
Invalid response ... 403 یا 401قانون وب سرور یا .htaccess مسیر را بستهقوانین ریدایرکت و دسترسی
DNS problem: NXDOMAINنام دامنه یا www در DNS وجود نداردرکورد www را اضافه کنید یا تیک www را بردارید
CAA record forbids issuanceرکورد CAA دامنه صدور توسط Let's Encrypt را رد می کندرکورد CAA
too many certificates already issuedrate limitبخش بعد

بررسی DNS و مسیر acme-challenge

این دستورها را از سیستم خودتان یا از ترمینال سرور اجرا کنید. example.com را با دامنه خودتان عوض کنید:

dig +short A example.com
dig +short AAAA example.com
dig +short CAA example.com
curl -I http://example.com/.well-known/acme-challenge/test

خروجی رکورد A باید IP سرور Plesk باشد. اگر رکورد AAAA وجود دارد و به IPv6 سرور شما اشاره نمی کند، Let's Encrypt ترجیحا با IPv6 وصل می شود و شکست می خورد. رکورد AAAA اشتباه را پاک کنید یا درستش کنید. خروجی CAA اگر خالی نباشد، باید letsencrypt.org را مجاز کرده باشد.

برای آزمایش مسیر challenge، فایل ساده ای در httpdocs/.well-known/acme-challenge/ بسازید و آدرسش را در مرورگر باز کنید. باید محتوای فایل را ببینید، نه 404 یا صفحه ریدایرکت. اگر قانون .htaccess تمام آدرس ها را به index.php می فرستد (در وردپرس و لاراول رایج است)، مسیر .well-known را از آن قانون مستثنا کنید. پیش از ویرایش، از فایل .htaccess یک نسخه پشتیبان بگیرید. توضیح بیشتر ریدایرکت ها در راهنمای ریدایرکت HTTPS با htaccess آمده است.

اگر همه چیز درست به نظر می رسد، لاگ Plesk را بخوانید. جزئیات درخواست Let's Encrypt در این فایل ثبت می شود:

tail -n 100 /var/log/plesk/panel.log

دامنه ای که پشت Cloudflare یا CDN دیگر است، ممکن است درخواست challenge را به سرور اصلی نرساند یا خودش ریدایرکت کند. برای صدور، پروکسی را موقتا خاموش کنید (حالت DNS only) و بعد از صدور دوباره روشن کنید.

خطای rate limit در Let's Encrypt

Let's Encrypt برای هر دامنه سقف صدور دارد. طبق مستندات رسمی rate limit از جمله پنج بار خطای اعتبارسنجی برای یک نام در یک ساعت، پنج گواهی تکراری برای همان مجموعه نام ها در هفته و تعداد محدودی گواهی برای هر دامنه ثبت شده در هفته مجاز است. عددهای دقیق ممکن است تغییر کند، پس صفحه مستندات را ببینید.

این خطا بیشتر موقع آزمایش و خطا پیش می آید، مثلا وقتی کسی ده بار پشت هم دکمه Get it free را بعد از یک خطای DNS می زند. علت اصلی را اول رفع کنید و بعد منتظر بمانید تا سقف آزاد شود. تکرار درخواست در این فاصله فقط شمارنده را بالا نگه می دارد.

چند دامنه و ساب دامین روی یک گواهی

هر ساب دامین که روی همین Plesk ساخته شده، گواهی جدا می خواهد مگر اینکه گواهی wildcard داشته باشید. هنگام صدور برای دامنه اصلی، Plesk فقط نام دامنه و www را در گواهی می گذارد و ساب دامین های دیگر را شامل نمی شود. پس بعد از ساخت هر ساب دامین جدید، همین مراحل را برای آن تکرار کنید. هر نام در گواهی باید در DNS رکورد درست داشته باشد، وگرنه کل صدور شکست می خورد.

گواهی wildcard در Plesk

گواهی wildcard (*.example.com) فقط با اعتبارسنجی DNS صادر می شود. در Plesk این گزینه معمولا زمانی در دسترس است که DNS دامنه روی خود Plesk مدیریت شود، چون افزونه باید رکورد TXT را خودش بسازد. اگر DNS دامنه در جای دیگری است (مثلا ثبت کننده دامنه)، گزینه wildcard را نمی بینید یا رکورد TXT را باید دستی بسازید. اگر فقط چند ساب دامین دارید، برای هر کدام گواهی جدا ساده تر است.

تمدید گواهی و علت شکست آن

تمدید خودکار از همان مسیر اعتبارسنجی اول استفاده می کند. پس هر چیزی که صدور را خراب می کرد، تمدید را هم خراب می کند. مواردی که بعد از صدور موفق باعث شکست تمدید می شوند:

  • انتقال دامنه به سرور یا DNS دیگر.
  • اضافه شدن قانون ریدایرکت یا فایروال که مسیر .well-known را می بندد.
  • تغییر رکورد AAAA.
  • حذف زیر دامنه ای که هنوز در گواهی هست.

گواهی را همین حالا هم می توانید دستی دوباره صادر کنید: در SSL/TLS Certificates دامنه، گواهی Let's Encrypt را باز کنید و Reissue Certificate را بزنید. تاریخ انقضای واقعی گواهی را با این دستور از بیرون سرور هم می بینید:

echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null | openssl x509 -noout -dates

استفاده از گواهی پولی یا گواهی دلخواه

اگر گواهی را از مرجع دیگری خریده اید یا Let's Encrypt برای نیاز شما کافی نیست، همان صفحه SSL/TLS Certificates یک فرم آپلود دارد. فایل کلید خصوصی، فایل گواهی و فایل زنجیره (CA certificate) را در آن می گذارید. بعد از ذخیره، به Hosting Settings دامنه بروید و گواهی را در فهرست Certificate انتخاب کنید. بدون این مرحله گواهی فقط در پنل ذخیره شده و سایت از آن استفاده نمی کند.

زنجیره ناقص رایج ترین اشتباه در این روش است: مرورگر دسکتاپ شاید خطا نشان ندهد، ولی برنامه های موبایل و curl خطای گواهی می دهند. فایل زنجیره را همراه گواهی آپلود کنید.

گواهی برای ایمیل و خود پنل

گواهی دامنه، ایمیل و آدرس پنل جدا از هم هستند. اگر کاربران ایمیل هشدار گواهی می بینند، گزینه امن کردن webmail را هنگام صدور بزنید یا آن را در Mail Settings دامنه بررسی کنید. برای امن کردن نام هاست خود پنل، در Tools & Settings بخش SSL/TLS Certificates را باز کنید. این بخش برای ادمین سرور است و روی هاست اشتراکی دیده نمی شود.

چطور مطمئن شویم نصب SSL درست انجام شده است

سایت را با https باز کنید و قفل مرورگر را ببینید. اگر مرورگر هشدار گواهی نشان داد، راهنمای خطای Your connection is not private علت های رایج مثل ناهماهنگی نام دامنه یا گواهی خودامضا را توضیح می دهد.

اگر گواهی را روی سرور مجازی خودتان نصب می کنید و Plesk را روی VPS ایران یا خارج راه اندازی کرده اید، تفاوت لوکیشن ها را در مقایسه VPS ایران و خارج می بینید. پیکوهاست هم VPS در ایران و هلند و فرانسه ارائه می کند.