ویرگول
ورودثبت نام
آرمان راد
آرمان رادوردپرس و زیرساخت وب می‌نویسم. تجربه‌های واقعی از هاست، دیتابیس و راه‌اندازی سایت برای کسی که می‌خواد کمتر خطا کند.
آرمان راد
آرمان راد
خواندن ۳ دقیقه·۴ روز پیش

گواهی SSL سایتم وسط قطعی اینترنت منقضی شد؛ چرا از آن روز سراغ DNS-01 رفتم

چند روز بود اینترنت بین الملل اختلال داشت و من فکر میکردم سایتهایم که سرورشان داخل است در امان اند. صبح یک روز مرورگر روی یکی از انها پیام اتصال شما خصوصی نیست را نشان داد. سرور روشن بود کد دست نخورده بود فقط گواهی SSL دیروز منقضی شده بود.

اسکریپت تمدید خودکار هر شب اجرا شده بود و هر شب بیصدا شکست خورده بود. من هم هیچ هشداری نگرفته بودم.

چرا تمدید شکست خورد

گواهیهای رایگان Let's Encrypt معمولا با روشی به اسم HTTP-01 تایید میشوند. سرور تایید از خارج کشور یک درخواست به ادرس خاصی روی سایت شما میفرستد و انتظار دارد فایل مشخصی ببیند. اگر این درخواست به سرور نرسد مالکیت دامنه تایید نمیشود.

در روزهای اختلال دقیقا همین درخواست ورودی از بیرون است که نمیرسد. یعنی مشکل از تنظیمات من نبود. مسیری که تایید از ان رد میشد بسته بود.

DNS-01 چه فرقی دارد

در روش DNS-01 به جای گذاشتن فایل روی سرور یک رکورد TXT به اسم _acme-challenge روی دامنه میسازید. سرور تایید فقط DNS دامنه را میپرسد و کاری به سرور شما ندارد.

اگر DNS دامنه روی سرویسی باشد که از بیرون جواب بدهد تایید انجام میشود حتی اگر خود سرور فقط از داخل در دسترس باشد. این همان چیزی بود که من لازم داشتم.

گواهی Wildcard هم با همین روش

یک مزیت جانبی هم پیدا کردم. من برای هر مشتری یک زیردامنه تست میسازم و قبلا برای هر کدام گواهی جدا میگرفتم. Let's Encrypt گواهی Wildcard مثل *.example.com را فقط با DNS-01 صادر میکند. حالا با یک گواهی همه زیردامنه های یک سطح پوشش داده میشوند.

کاری که کردم

مراحل کلی برای هر ابزار ACME تقریبا یکی است:

  1. ابزار تمدید را روی حالت DNS گذاشتم. با certbot یا acme.sh این کار با یک گزینه انجام میشود.

  2. ابزار یک مقدار تصادفی تولید کرد و از من خواست رکورد TXT با اسم _acme-challenge و همان مقدار بسازم.

  3. رکورد را در پنل DNS ساختم و چند دقیقه صبر کردم تا منتشر شود.

  4. با ابزار dig یا یک سرویس بررسی انلاین مطمئن شدم رکورد دیده میشود.

  5. تایید را ادامه دادم و گواهی صادر شد.

dig TXT _acme-challenge.example.com +short

مرحله دستی را حذف کنید

ساختن دستی رکورد برای بار اول خوب است ولی گواهیها هر چند وقت یک بار تمدید میشوند و من حافظه خوبی برای این کارها ندارم. اگر سرویس DNS شما API داشته باشد ابزارهایی مثل acme.sh میتوانند رکورد را خودشان بسازند و پاک کنند. اینطوری تمدید واقعا خودکار میشود با هر روش دسترسی که سرور داشته باشد.

هشدار انقضا

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

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

جمع بندی

بهترین زمان برای عوض کردن روش تایید روزی است که اینترنت وصل است و میشود با خیال راحت تست کرد. صبر نکنید تا گواهی وسط یک اختلال منقضی شود.

برای دامنه هایی که خودم مدیریت میکنم الان DNS و SSL را روی پاستاکلود نگه میدارم چون DNS Challenge و گواهی Wildcard را یکجا دارد. اگر سایت وردپرسی دارید اکو وردپرس پاستا هم SSL را خودش تمدید میکند و لازم نیست دستی نگران انقضا باشید.

شما برای تمدید SSL از HTTP-01 استفاده میکنید یا DNS-01؟

ssllets encryptdnsامنیت سایتگواهی ssl
۳
۰
آرمان راد
آرمان راد
وردپرس و زیرساخت وب می‌نویسم. تجربه‌های واقعی از هاست، دیتابیس و راه‌اندازی سایت برای کسی که می‌خواد کمتر خطا کند.
شاید از این پست‌ها خوشتان بیاید