آموزش نصب SSL با acme.sh + حل خطای curl error 28 (مشکل ZeroSSL)

حل خطای curl error 28

در این مقاله قصد داریم به آموزش نصب SSL با acme.sh بپردازیم. اگر در حال کانفیگ سرور لینوکس هستید و برای نصب گواهی SSL رایگان سراغ ابزار قدرتمند acme.sh رفته‌اید، احتمالاً با یک ارور به شدت روی اعصاب مواجه شده‌اید: خطای curl error 28 یا Timeout شدن درخواست‌ها.

این خطا معمولاً به خاطر محدودیت‌های شبکه (مخصوصاً در سرورهای ایران) و گیر کردن acme.sh روی سرور پیش‌فرضش یعنی ZeroSSL رخ می‌دهد. در این مقاله آموزشی از آکادمی کوکارو، قرار نیست وقت شما را با تعریف «SSL چیست» تلف کنیم! مستقیم می‌رویم سراغ اصل مطلب: نصب صفر تا صد SSL با acme.sh روی آپاچی (AlmaLinux/CentOS) و دور زدن قطعی خطای تحریم و تایم‌اوت.

نمایش خطای تایم‌اوت curl error 28 هنگام استفاده از ZeroSSL در ترمینال لینوکس

پیش‌نیازها: قبل از شروع کانفیگ

قبل از اینکه دست به ترمینال ببرید، این ۴ مورد را چک کنید:

۱. دسترسی ریشه: به سرور خود دسترسی root (یا sudo) داشته باشید.

۲. اتصال دامنه: دامنه شما باید دقیقاً به آی‌پی سرور اشاره کند (با دستور ping yourdomain.com مطمئن شوید که آی‌پی سرور پینگ می‌شود).

۳. وب‌سرور آپاچی: Apache باید نصب و فعال باشد و مسیر سایت شما مشخص باشد (مثلاً /var/www/[yourdomain.com/public_html](https://yourdomain.com/public_html)).

۴. پورت‌های آزاد: پورت‌های 80 (HTTP) و 443 (HTTPS) روی فایروال سرور شما باز باشند.

مراحل نصب SSL با acme.sh در لینوکس

مرحله ۱: نصب کلاینت acme.sh

اگر هنوز این ابزار را نصب نکرده‌اید، با اجرای یکی از دستورات زیر آن را مستقیم از مخزن اصلی دریافت و نصب کنید:

curl https://get.acme.sh | sh

یا:

wget -O- https://get.acme.sh | sh

بعد از نصب، برای اینکه دستورات در همین سشن ترمینال فعال شوند، سورس را مجدداً لود کنید:

source ~/.bashrc

مرحله ۲: کلید طلایی! تغییر سرور به Let’s Encrypt

این دقیقاً همان مرحله‌ای است که ۹۰ درصد آموزش‌ها جا می‌اندازند و باعث بروز خطای curl error: 28 می‌شوند. کلاینت acme.sh مدتی است که مرجع صدور پیش‌فرض خود را روی ZeroSSL قرار داده که در شبکه‌های ایران به شدت دچار اختلال است.

با این دستور صراحتاً سرور را به Let’s Encrypt تغییر دهید تا مشکل تایم‌اوت برای همیشه حل شود:

/root/.acme.sh/acme.sh –set-default-ca –server letsencrypt

مرحله ۳: دریافت گواهی (Issue Certificate)

حالا به acme.sh دستور می‌دهیم که یک فایل چالشی (Challenge) در روت سایت ما بسازد تا مالکیت دامنه را تأیید کند.

(توجه: در کدهای زیر، دامنه و مسیر public_html را با اطلاعات سایت خودتان جایگزین کنید).

/root/.acme.sh/acme.sh –issue -d yourdomain.com -d www.yourdomain.com –webroot /var/www/yourdomain.com/public_html

اگر کانفیگ درست باشد، در خروجی ترمینال پیام سبز رنگ Cert success را به همراه مسیر ذخیره‌سازی فایل‌ها مشاهده خواهید کرد.

صدور موفقیت‌آمیز گواهی SSL با Let's Encrypt

مرحله ۴: آماده‌سازی پوشه‌های امن سیستمی

گواهی‌های تولید شده به‌طور پیش‌فرض در پوشه مخفی /root/.acme.sh/ ذخیره می‌شوند. برای اینکه وب‌سرور آپاچی بتواند به‌صورت استاندارد و امن به آن‌ها دسترسی داشته باشد، پوشه‌های زیر را می‌سازیم و پرمیشن امنیتی 700 را به کلید خصوصی می‌دهیم:

mkdir -p /etc/ssl/private

chmod 700 /etc/ssl/private

مرحله ۵: نصب و کپی گواهی در مسیر استاندارد

با اجرای دستور زیر، گواهی‌ها را به پوشه‌های استانداردی که ساختیم کپی کرده و به acme.sh می‌گوییم بعد از هر بار تمدید، آپاچی را به‌صورت خودکار ریلود کند:

/root/.acme.sh/acme.sh –install-cert -d yourdomain.com -d www.yourdomain.com \

–cert-file /etc/ssl/certs/yourdomain.com.crt \

–key-file /etc/ssl/private/yourdomain.com.key \

–fullchain-file /etc/ssl/certs/yourdomain.com.fullchain \

–reloadcmd “systemctl reload httpd”

مرحله ۶: تنظیم هاست مجازی (VirtualHost) آپاچی برای HTTPS

گواهی صادر شده است، اما آپاچی هنوز نمی‌داند چطور باید با پورت ۴۴۳ کار کند. باید فایل کانفیگ سایت را ویرایش کنیم.

یک فایل جدید در مسیر کانفیگ‌های آپاچی بسازید:

nano /etc/httpd/conf.d/yourdomain-ssl.conf

سپس کدهای زیر را درون آن قرار دهید (فراموش نکنید که ServerName و DocumentRoot را با دیتای سرور خودتان تغییر دهید):

<VirtualHost *:443>

    ServerName yourdomain.com

    ServerAlias www.yourdomain.com

    DocumentRoot /var/www/yourdomain.com/public_html
    # فعال‌سازی SSL

    SSLEngine on

    SSLCertificateFile /etc/ssl/certs/yourdomain.com.crt

    SSLCertificateKeyFile /etc/ssl/private/yourdomain.com.key

    SSLCertificateChainFile /etc/ssl/certs/yourdomain.com.fullchain
    <Directory /var/www/yourdomain.com/public_html>

        AllowOverride All

        Require all granted

    </Directory>

</VirtualHost>

مرحله ۷: تست و بارگذاری مجدد سرور

حالا که همه‌چیز تنظیم شده، یک‌بار آپاچی را ریلود کنید تا گواهی‌های جدید را بخواند:

systemctl reload httpd

برای تست نهایی، می‌توانید از دستور curl در ترمینال استفاده کنید. اگر خروجی شامل کدهای HTML سایتتان بود، یعنی SSL با موفقیت فعال شده است:

curl -k -H “Host: yourdomain.com” https://127.0.0.1 | head -30

مرحله ۸: فورس ریدایرکت HTTP به HTTPS

برای اینکه تمام ورودی‌های سایت به‌صورت خودکار و ایمن به نسخه https منتقل شوند، قطعه کد زیر را در انتهای فایل .htaccess که در ریشه سایتتان قرار دارد وارد کنید:

RewriteEngine On

RewriteCond %{HTTPS} off

RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]

مرحله ۹: اطمینان از تمدید خودکار (Auto-Renewal)

گواهی‌های Let’s Encrypt فقط ۹۰ روز اعتبار دارند. ابزار acme.sh معمولاً خودش یک کرون‌جاب (Cron Job) برای تمدید خودکار تنظیم می‌کند. برای اطمینان از وجود آن دستور زیر را بزنید:

crontab -l | grep acme.sh

اگر خروجی خالی بود و کرون‌جاب ست نشده بود، با این دستور آن را فعال کنید:

/root/.acme.sh/acme.sh –cron

جدول عیب‌یابی سریع خطاهای acme.sh و آپاچی

اگر در هر یک از مراحل بالا به بن‌بست خوردید، نگاهی به این جدول بیندازید:

خطای مشاهده شده در ترمینالعلت مشکلراه‌حل سریع
curl error: 28عدم دسترسی به سرور ZeroSSL به دلیل تحریم یا اختلال شبکه.طبق مرحله ۲، سرور دیفالت را به letsencrypt تغییر دهید.
No such file or directoryپوشه /etc/ssl/private/ در سرور شما وجود ندارد.طبق مرحله ۴ پوشه را بسازید و سطح دسترسی 700 به آن بدهید.
SSLEngine not allowed hereماژول mod_ssl روی آپاچی سرور شما نصب یا فعال نیست.با دستور yum install mod_ssl آن را نصب و آپاچی را ری‌استارت کنید.
نمایش صفحه پیش‌فرض آپاچی (Test Page)کانفیگ VirtualHost یا مسیر DocumentRoot اشتباه ست شده است.مسیر DocumentRoot در مرحله ۶ را دقیقاً با ریشه سایت خود (محل فایل index.php) تطبیق دهید.

سخن پایانی کانفیگ سرورهای لینوکسی و نصب SSL با acme.sh همیشه پر از چالش‌های ریز و درشت است. با استفاده از این روش، بدون نیاز به نصب پنل‌های سنگین مدیریتی، امنیت سایت خود را با یک کلاینت سبک تضمین کرده‌اید. اگر در طول نصب با ارور جدیدی برخورد کردید که در جدول بالا نبود، ارور را در بخش نظرات همین صفحه کامنت کنید تا با هم آن را بررسی کنیم.

راستی اگر SSL خودتون رو از ابرآروان گرفتید و در ادامه با ارور ۵۰۲ مواجه شدید، [مقاله‌ی آموزش حل خطای ۵۰۲ ابرآروان و مشکل قطعی SSL] را حتماً مشاهده کنید.