چند روز بود اینترنت بین الملل اختلال داشت و من فکر میکردم سایتهایم که سرورشان داخل است در امان اند. صبح یک روز مرورگر روی یکی از انها پیام اتصال شما خصوصی نیست را نشان داد. سرور روشن بود کد دست نخورده بود فقط گواهی SSL دیروز منقضی شده بود.
اسکریپت تمدید خودکار هر شب اجرا شده بود و هر شب بیصدا شکست خورده بود. من هم هیچ هشداری نگرفته بودم.
گواهیهای رایگان Let's Encrypt معمولا با روشی به اسم HTTP-01 تایید میشوند. سرور تایید از خارج کشور یک درخواست به ادرس خاصی روی سایت شما میفرستد و انتظار دارد فایل مشخصی ببیند. اگر این درخواست به سرور نرسد مالکیت دامنه تایید نمیشود.
در روزهای اختلال دقیقا همین درخواست ورودی از بیرون است که نمیرسد. یعنی مشکل از تنظیمات من نبود. مسیری که تایید از ان رد میشد بسته بود.
در روش DNS-01 به جای گذاشتن فایل روی سرور یک رکورد TXT به اسم _acme-challenge روی دامنه میسازید. سرور تایید فقط DNS دامنه را میپرسد و کاری به سرور شما ندارد.
اگر DNS دامنه روی سرویسی باشد که از بیرون جواب بدهد تایید انجام میشود حتی اگر خود سرور فقط از داخل در دسترس باشد. این همان چیزی بود که من لازم داشتم.
یک مزیت جانبی هم پیدا کردم. من برای هر مشتری یک زیردامنه تست میسازم و قبلا برای هر کدام گواهی جدا میگرفتم. Let's Encrypt گواهی Wildcard مثل *.example.com را فقط با DNS-01 صادر میکند. حالا با یک گواهی همه زیردامنه های یک سطح پوشش داده میشوند.
مراحل کلی برای هر ابزار ACME تقریبا یکی است:
ابزار تمدید را روی حالت DNS گذاشتم. با certbot یا acme.sh این کار با یک گزینه انجام میشود.
ابزار یک مقدار تصادفی تولید کرد و از من خواست رکورد TXT با اسم _acme-challenge و همان مقدار بسازم.
رکورد را در پنل DNS ساختم و چند دقیقه صبر کردم تا منتشر شود.
با ابزار dig یا یک سرویس بررسی انلاین مطمئن شدم رکورد دیده میشود.
تایید را ادامه دادم و گواهی صادر شد.
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؟