ایجاد SSL برای سایت وردپرسی در محیط لوکال، یکی از نیازهای پرتکرار توسعه‌دهندگان است که اغلب به‌دلیل پیچیدگی ظاهری نادیده گرفته می‌شود. برخلاف تصور رایج، HTTPS در محیط لوکال تنها یک تجمل نیست؛ یک ضرورت فنی است. بسیاری از قابلیت‌های مرورگرهای مدرن مانند Service Worker، Geolocation، Clipboard API، Notifications و بخش بزرگی از Web APIs تنها در بستر امن (Secure Context) کار می‌کنند. علاوه بر این، توسعه‌دهندگانی که روی درگاه‌های پرداخت، سرویس‌های احراز هویت OAuth یا APIهای خارجی کار می‌کنند، بدون HTTPS محلی نمی‌توانند جریان واقعی را تست کنند.

در پروژه‌های متعدد وردپرسی، دیده‌ام که توسعه‌دهندگانی که SSL محلی را جدی می‌گیرند، در مرحله استقرار با خطاهای کمتری مواجه می‌شوند چون رفتار سایت در محیط امن را از ابتدا تجربه کرده‌اند.

چرا SSL محلی ضروری است؟

  • Secure Context: بسیاری از APIهای مدرن فقط در بستر HTTPS کار می‌کنند.
  • Service Worker: برای تست PWA و Offline Mode ضروری است.
  • OAuth: اکثر سرویس‌ها در Redirect URI فقط HTTPS را می‌پذیرند.
  • درگاه پرداخت: تست واقعی درگاه‌ها نیازمند HTTPS است.
  • Cookie Secure: کوکی‌های Secure فقط در HTTPS ارسال می‌شوند.
  • Mixed Content: بررسی زودهنگام خطاهای Mixed Content.
  • Core Web Vitals: تست HTTP/2 و HTTP/3 نیازمند HTTPS است.
  • تست CDN: پیکربندی CDN در محیط واقعی.

انواع گواهی برای محیط لوکال

نوعاعتبارپیچیدگی
Self-Signedخودامضا، نیازمند تأیید دستیپایین
mkcertمعتبر در مرورگر محلیپایین
Let's Encrypt با DNS چالشمعتبر جهانیبالا

گواهی Self-Signed

ساده‌ترین روش، تولید گواهی خودامضا با OpenSSL است.

تولید گواهی با OpenSSL

openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
-keyout example.local.key -out example.local.crt \
-subj "/CN=example.local"

معایب

  • مرورگرها به آن اعتماد نمی‌کنند.
  • نمایش هشدار امنیتی در هر بازدید.
  • نیازمند تأیید دستی.

mkcert و گواهی محلی معتبر

mkcert ابزاری است که یک CA محلی روی سیستم شما نصب می‌کند و گواهی‌های تولیدشده توسط آن، در مرورگر معتبر شناخته می‌شوند.

نصب mkcert

  • macOS: brew install mkcert
  • Ubuntu: sudo apt install mkcert
  • Windows: choco install mkcert

استفاده

mkcert -install
mkcert example.local "*.example.local" localhost 127.0.0.1

خروجی: دو فایل PEM و KEY که در پیکربندی سرور استفاده می‌شوند.

SSL در XAMPP

  1. تولید گواهی با mkcert یا OpenSSL.
  2. کپی فایل‌ها به xampp/apache/conf/ssl.crt و ssl.key.
  3. ویرایش httpd-ssl.conf:

SSLCertificateFile "conf/ssl.crt/example.local.crt"
SSLCertificateKeyFile "conf/ssl.key/example.local.key"

  1. ویرایش httpd-vhosts.conf:

<VirtualHost *:443>
DocumentRoot "C:/xampp/htdocs/example"
ServerName example.local
SSLEngine on
SSLCertificateFile "conf/ssl.crt/example.local.crt"
SSLCertificateKeyFile "conf/ssl.key/example.local.key"
</VirtualHost>

  1. افزودن به فایل hosts: 127.0.0.1 example.local
  2. راه‌اندازی مجدد Apache.
  3. دسترسی به https://example.local.

SSL در Local by Flywheel

Local به‌طور پیش‌فرض از Trusted SSL پشتیبانی می‌کند.

  1. باز کردن سایت در Local.
  2. کلیک روی Trust در بالای پنجره.
  3. فعال‌سازی SSL.
  4. دسترسی به https://example.local.

SSL در DevKinsta

DevKinsta گواهی SSL خودکار برای هر سایت محلی تولید می‌کند.

  1. ایجاد سایت جدید.
  2. SSL خودکار اعمال می‌شود.
  3. دسترسی به https://example.local.

SSL در Docker

در محیط Docker، می‌توان از تراکنش‌های SSL در Nginx یا Traefik استفاده کرد.

رویکرد با Nginx و mkcert

  1. تولید گواهی با mkcert.
  2. Mount کردن گواهی در کانتینر.
  3. پیکربندی Nginx برای HTTPS.
  4. انتشار پورت ۴۴۳.

رویکرد با Traefik

Traefik به‌طور خودکار گواهی تولید و مدیریت می‌کند.

SSL در Laragon

Laragon به‌طور پیش‌فرض SSL را برای دامنه‌های .test پشتیبانی می‌کند.

  1. Laragon → Preferences → SSL.
  2. فعال‌سازی Auto SSL.
  3. راه‌اندازی مجدد Laragon.

تنظیمات wp-config.php

برای HTTPS محلی، این تنظیمات را اضافه کنید:

define( 'WP_HOME', 'https://example.local' );
define( 'WP_SITEURL', 'https://example.local' );
define( 'FORCE_SSL_ADMIN', true );

اگر مرورگر اعتماد کامل ندارد، می‌توانید موقتاً:

define( 'WP_HTTP_BLOCK_EXTERNAL', false );

و در برخی موارد برای رفع خطای SSL Verify در APIهای محلی:

add_filter( 'https_ssl_verify', '__return_false' );

توجه: این تنظیمات فقط برای محیط لوکال، نه تولید.

پیکربندی .htaccess

ریدایرکت HTTP به HTTPS محلی:

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

اعتماد به گواهی در مرورگر

Chrome و Edge

  1. بازدید از سایت.
  2. کلیک روی Advanced.
  3. Proceed to site (unsafe).

Firefox

  1. کلیک روی Advanced.
  2. Accept the Risk and Continue.

روش ماندگار (mkcert)

پس از اجرای mkcert -install، مرورگرها به CA محلی اعتماد می‌کنند و هشدار نشان داده نمی‌شود.

رفع مشکلات رایج

مشکل: Mixed Content

URLهای HTTP در قالب یا دیتابیس را جایگزین کنید:

wp search-replace 'http://example.local' 'https://example.local'

مشکل: حلقه ریدایرکت

بررسی wp-config.php و .htaccess برای ریدایرکت‌های تکراری.

مشکل: عدم اعتماد مرورگر به mkcert

اجرای mkcert -install با دسترسی ادمین و راه‌اندازی مجدد مرورگر.

مشکل: خطای SSL Verify در APIهای خارجی

در محیط لوکال فقط:

add_filter( 'https_ssl_verify', '__return_false' );

رویکردهای توصیه‌شده

  • استفاده از mkcert برای اعتماد کامل.
  • پرهیز از Self-Signed در پروژه‌های طولانی.
  • پیکربندی صحیح wp-config.php.
  • رفع Mixed Content در محیط لوکال.
  • تست با مرورگرهای مختلف.
  • مستندسازی راه‌اندازی SSL.
  • استفاده از ابزارهایی مانند Local یا DevKinsta که SSL خودکار دارند.
«محیط لوکال بدون HTTPS، محیط واقعی نیست؛ بخش بزرگی از رفتار مرورگر و APIها در آن قابل تست نیست.»

پرسش‌های پرتکرار

چرا به SSL در محیط لوکال نیاز دارم؟

بسیاری از APIهای مدرن، Service Worker، OAuth و تست درگاه پرداخت نیازمند بستر امن هستند.

تفاوت Self-Signed و mkcert چیست؟

Self-Signed نیازمند تأیید دستی در هر بازدید است. mkcert یک CA محلی نصب می‌کند و گواهی‌ها معتبر شناخته می‌شوند.

چگونه در XAMPP SSL فعال کنم؟

با تولید گواهی، ویرایش httpd-ssl.conf و httpd-vhosts.conf و راه‌اندازی مجدد Apache.

آیا Local و DevKinsta SSL خودکار دارند؟

بله، هر دو Trusted SSL خودکار ارائه می‌دهند.

چگونه به گواهی Self-Signed در Chrome اعتماد کنم؟

با کلیک روی Advanced و Proceed. اما برای اعتماد ماندگار، از mkcert استفاده کنید.

آیا SSL محلی بر سئو اثر دارد؟

خیر، چون محیط لوکال در موتورهای جستجو ایندکس نمی‌شود.

چگونه Mixed Content را در محیط لوکال رفع کنم؟

با جستجو و جایگزینی URLهای HTTP در دیتابیس با HTTPS.

آیا در Docker می‌توان SSL خودکار داشت؟

بله، با Nginx، Traefik یا Caddy می‌توان SSL خودکار در Docker داشت.

پایان‌بندی

ایجاد SSL برای سایت وردپرسی در محیط لوکال، یکی از نیازهای پرتکرار توسعه‌دهندگان حرفه‌ای است که با ابزارهای مدرن مانند mkcert، Local و DevKinsta، به‌سادگی انجام می‌شود. با پیکربندی صحیح، توسعه‌دهنده می‌تواند رفتار سایت را در بستر امن تجربه کند و از خطاهای زمان استقرار جلوگیری نماید.

از منظر مهندسی سطح ارشد، سه اصل در SSL محلی تعیین‌کننده است: استفاده از mkcert برای اعتماد کامل، پیکربندی صحیح wp-config.php و .htaccess، و رفع Mixed Content پیش از تست‌های پیشرفته.

برای درک عمیق‌تر، مقاله فعال‌سازی HTTPS در XAMPP یا محیط توسعه لوکال و مقاله راه‌اندازی SSL در وردپرس و انتقال سایت به HTTPS را مطالعه کنید.

اگر در پروژه‌های خود تجربه‌ای از SSL محلی داشته‌اید، تجربه‌تان را در دیدگاه‌ها بنویسید. 🔒