وقتی تعداد زیردامنه ها زیاد میشود، صادر کردن گواهی جداگانه برای هر کدام خسته کننده و شکننده است. گواهی وایلدکارت این مشکل را حل میکند اما Let's Encrypt آن را فقط از طریق اعتبارسنجی DNS صادر میکند. این روش برای سرورهایی که پورت ۸۰ عمومی ندارند یا پشت شبکه داخلی هستند هم تنها گزینه است.
چرا گاهی مجبورید سراغ DNS بروید
در اعتبارسنجی از راه HTTP، سرور Let's Encrypt باید بتواند از اینترنت به پورت ۸۰ شما وصل شود. در اعتبارسنجی DNS چنین نیازی نیست؛ کافی است یک رکورد TXT مشخص را در دامنه خود بسازید. همین تفاوت باعث میشود این روش در چند سناریو تنها راه ممکن باشد.
- گواهی وایلدکارت که فقط با این روش صادر میشود.
- سرورهای داخلی که از اینترنت قابل دسترسی نیستند.
- سرویس هایی که پشت فایروال سازمانی یا شبکه محدود قرار دارند.
- مواقعی که پورت ۸۰ به هر دلیلی قابل باز کردن نیست.
روش دستی و محدودیت جدی آن
ساده ترین شکل کار این است که Certbot یک مقدار به شما بدهد، شما آن را به عنوان رکورد TXT ثبت کنید و بعد ادامه دهید. برای یک بار امتحان کردن خوب است، اما یک مشکل اساسی دارد: هر نود روز باید همین کار را دستی تکرار کنید.
به همین دلیل روش دستی را فقط برای آزمایش پیشنهاد میکنیم. برای سرویس واقعی حتما یکی از دو روش بعدی را انتخاب کنید.
sudo certbot certonly --manual --preferred-challenges dns -d "*.example.com" -d example.comdig +short TXT _acme-challenge.example.com @1.1.1.1نکته ای که زیاد فراموش میشود
گواهی وایلدکارت خود دامنه اصلی را پوشش نمیدهد. یعنی گواهی صادر شده برای example.com.* روی blog.example.com کار میکند اما روی example.com خالی کار نمیکند. اگر هر دو را لازم دارید، باید هر دو را در دستور صدور بیاورید.
همچنین وایلدکارت فقط یک سطح را پوشش میدهد. برای a.b.example.com باید وایلدکارت جداگانه b.example.com.* بگیرید.
روش اول: افزونه اختصاصی ارائه دهنده DNS
اگر سرویس DNS شما API دارد و Certbot افزونه ای برایش ارائه کرده، این تمیزترین راه است. Certbot خودش رکورد را میسازد، اعتبارسنجی را انجام میدهد و رکورد را پاک میکند. تمدید هم کاملا خودکار خواهد بود.
فایل اعتبارنامه حاوی کلید API است، پس دسترسی آن را حتما محدود کنید. اگر این فایل قابل خواندن برای همه باشد، عملا کنترل DNS دامنه را واگذار کرده اید.
sudo apt install python3-certbot-dns-cloudflaresudo mkdir -p /root/.secrets
sudo nano /root/.secrets/cloudflare.ini
sudo chmod 600 /root/.secrets/cloudflare.inisudo certbot certonly --dns-cloudflare --dns-cloudflare-credentials /root/.secrets/cloudflare.ini --dns-cloudflare-propagation-seconds 60 -d "*.example.com" -d example.comروش دوم: acme-dns برای وقتی افزونه وجود ندارد
بسیاری از ارائه دهندگان DNS، به خصوص سرویس های محلی، افزونه رسمی در Certbot ندارند. راه حل هوشمندانه acme-dns است: به جای اینکه Certbot به DNS اصلی شما دسترسی داشته باشد، فقط رکورد acme-challenge_ را با یک CNAME به یک سرویس جداگانه واگذار میکنید.
مزیت امنیتی این روش قابل توجه است. کلید API دامنه اصلی شما هیچ جا ذخیره نمیشود و اگر سرور گواهی به خطر بیفتد، مهاجم فقط به همان رکورد اعتبارسنجی دسترسی دارد نه کل دامنه.
یک نکته عملی: اسکریپت اصلی acme-dns-certbot سال ها پیش برای پایتون ۲ نوشته شده بود و روی اوبونتو و دبیان امروزی که پایتون ۲ ندارند اجرا نمیشود. حتما نسخه سازگار با پایتون ۳ را بردارید یا خط اول اسکریپت را به مفسر پایتون ۳ تغییر دهید.
- رکورد CNAME را فقط یک بار میسازید و بعد از آن تمدیدها خودکار است.
- اسکریپت در اولین اجرا مقدار CNAME را چاپ میکند؛ همان را در DNS ثبت کنید.
- قبل از ادامه دادن، انتشار رکورد CNAME را با dig بررسی کنید.
تمدید و آزمایش نهایی
بعد از اینکه روش خودکار را راه انداختید، حتما تمدید را شبیه سازی کنید. اگر این آزمایش بدون خطا رد شد، یعنی نود روز بعد هم بدون دخالت شما کار خواهد کرد.
اگر از روش دستی استفاده کرده اید، این آزمایش شکست میخورد و این دقیقا همان چیزی است که نشان میدهد چرا روش دستی برای سرویس واقعی مناسب نیست.
sudo certbot renew --dry-runsudo certbot certificatesپرسش های پرتکرار
چرا برای گواهی وایلدکارت حتما باید از اعتبارسنجی DNS استفاده کرد؟
سرویس Lets Encrypt گواهی وایلدکارت را فقط از طریق اعتبارسنجی DNS صادر میکند و روش مبتنی بر HTTP برای آن پذیرفته نیست.
آیا گواهی وایلدکارت خود دامنه اصلی را هم پوشش میدهد؟
خیر. گواهی صادر شده برای زیردامنه ها روی خود دامنه اصلی کار نمیکند. اگر هر دو را لازم دارید باید هر دو را در دستور صدور بیاورید.
اگر ارائه دهنده DNS من افزونه Certbot ندارد چه کنم؟
میتوانید با acme-dns رکورد اعتبارسنجی را با یک CNAME به سرویس جداگانه واگذار کنید. اینطور کلید API دامنه اصلی شما روی سرور ذخیره نمیشود.
به راهنمای بیشتری نیاز دارید؟
تیم پشتیبانی هایوهاست برای انتخاب و مدیریت سرویس کنار شماست.