در این مقاله ابتدا به دلایل گسترش گواهینامههای Let’s Encrypt پرداخته و آن را بررسی مینماییم. در ادامه به اشکال اخیر پیشآمده میپردازیم و نحوهی حل آن را بیان میکنیم.
چرا پروتکلهای رمزنگاری؟
در گذشته، دو دلیل عمده برای عدم استفاده از راهکارهای رمزنگاری وجود داشتند:
- تولید و استفاده از گواهینامههای TLS بسیار پیچیده و وقتگیر بودند.
- صاحبان وبسایتها باید هزینههایی را پرداخت میکردندکه بسیاری از وبسایتهای کوچک و متوسط مانند کسبوکارهای کوچک نیازی به پرداخت آن نمیدیدند، به ویژه با توجه به اینکه گواهینامهها مداوما نیاز به تمدید مجدد داشتند.
ظهور Let’s Encrypt
با ظهور Let’s Encrypt نه تنها گواهینامهها را به صورت رایگان در اختیار همگان قرار گرفت بلکه با انجام خودکار و در نتیجه سادهتر روند تولید و تمدید مجدد آنها، این مساله به صورت گسترده مورد استفاده کاربران قرار گرفت.
اگرچه Let’s Encrypt اولین پروژهی رایگان ساختن گواهینامههای TLS نبود، اما قطعا موفقترین نمونه در توسعه گواهینامههای رایگان و سهولت دسترسی کاربران به آنها بوده است.
همانطور که تصور میکنید، فرآیند صدور گواهینامه به صورت خودکار یک شمشیر دو لبه است.
نقص در فرآیند صدور یا اشکال در پیادهسازی نرمافزاری که پروتکل را پشتیبانی میکند، میتواند عواقب پیشبینی نشده جدی برای همه کاربران اعم از صاحبین کسبوکار و مشتریان آنها به همراه داشته باشد.
متاسفانه یک اشکال در کد برنامهنویسی سیستم اعتبارسنجی خودکار Let’s Encrypt به تازگی کشف شد که بیش از ۳ میلیون دامنه تحت پوشش این شرکت را تحت تاثیر قرار داد. این ۳ میلیون نام دامنه در حدود ۱۲ میلیون Domain Name و Subdomain را تحت پوشش خود داشتند.
در نگاه اول ۳ میلیون نام دامنه در میان ۱۹۰ میلیون نام دامنه که مطابق ادعای این شرکت تحت پوشش آن هستند عدد بزرگی به نظر نمیآید.
اما شرکتهایی که دارای گواهینامههای آسیبدیده بودند، میبایست به جای آنکه منتظر بمانند تا سرور آنها به طور خودکار گواهینامه آنها را تمدید کند، خود دست به کار شوند.
چرا که نمایش اخطار عدم اعتبار یک گواهی TLS بر روی وبسایت تعداد زیادی از کاربران را نسبت به وبسایت غیر مطمئن کرده و آنها را به خروج از وبسایت ترغیب میکرد و این برای وبسایتهای تجاری بزرگ یک فاجعه بود.
اما اشکال در کجا بود؟
یک اشکال کوچک در کد برنامه ی باعث این اتفاق شده بود.
بگذارید از ابتدا شروع کنیم…
گواهیهای Let’s Encrypt ۳ ماهه (دارای اعتبار 90 روزه) هستند و در صورتی که ۳۰ روز یا کمتر معتبر باشند به صورت خودکار تمدید میشوند.
بسیاری از کاربران چندین گواهی برای چندین وبسایت و یا زیردامنه خود دارند. برای مثال download.example.com . Community.example.com و. Billing.example.com
به دلیل کارآیی و اطمینان بیشتر کاربران میتوانند به صورت همزمان گواهی چندین دامنه و زیر دامنه خود را تمدید کنند. در بسیاری از موارد سیستمهای خودکار تمدید دامنه این کار را برای آنها انجام میدهند.
CAA
Let’s Encrypt به عنوان یک راهکار امنیتی مضاعف در هنگام تجدید گواهیها برای هر دامنه CAA یا Certificate Authority Authorization را هم چک میکند.
برای بررسی CAA لازم است تا نام دامنه در NameServer (DNS سرورها) مربوط به آن چک شود و بررسی شود که مالک دامنه محدودیتی برای تمدید گواهی امنیتی تنظیم نکرده باشد. مالک دامنه لزوما کسی که درخواست تمدید گواهی امنیتی را داده نیست و میتواند شخص دیگری باشد.
برای مثال ممکن است مالک دامنه از Let’s Encrypt خود استفاده نکند و یک رکورد در DNS خود تنظیم کرده باشد که اعلام میکند تنها شرکت xyz برای صدور گواهینامه برای این دامنه معتبر است. این کار باعث میشود اشخاص ثالث غیرمجاز برای دریافت گواهینامههای جعلی با استفاده از جعل هویت آنلاین شما مسیر سختتری پیش رو داشته باشند. اگر شما اجبار به استفاده از یک شرکت خاص صدور گواهینامه برای وبسایت خود داشته باشید باعث میشوید این افراد از مسیر مورد نظر شما برای صدور گواهی امنیتی پیروی کنند که در نتیجه امکان به دام انداختن آنها برای شما راحتتر خواهد بود.
مطابق قوانین امضای گواهینامه، صادرکننده گواهینامه باید کمتر از ۸ ساعت رکورد CAA دامنه مورد نظر را قبل از صدور گواهینامه چک کرده باشد. تا حداکثر همزمانی ممکن برای چک کردن اجازه صدور گواهی ایجاد شود.
یک اشکال کوچک!
اشکال برنامه در همینجا اتفاق میافتاد:
زمانی که Let’s Encrypt لیستی از دامنهها، مثلا ۱۰ دامنه را برای بررسی سوابق CAA انتخاب کرد بهجای بررسی سوابق CAA برای هر کدام از آنها، یکی از دامنهها به صورت تصادفی انتخاب شدند و سوابق برای آن دامنه ۱۰ بار چک شد و ۹ دامنه دیگر اصلا بررسی نشدند.
این کدی بود که باید اجرا میشد:
for name in {'one.example', 'two.example', 'three.example'} do
check_caa_of(name)
end
// all domains checked at this point
اما این کد به جای آن اجرا شد:
for name in {'one.example', 'two.example', 'three.example'} do
oops = 'two.example' // list is "traversed" but name never updates,
// so one domain gets checked N times
check_caa_of(oops) // instead of N domains checked once each
end
// two domains unchecked here
در حقیقت تعداد دامنههایی که در صورت بررسی رد میشدند بسیار کم بود و عملا احتمال کلاهبرداری از این راه بسیار ناچیز بود، اما قوانین بازی در دنیای واقعی همین احتمال ناچیز را هم در نظر میگیرد. بنابراین سازمانهای صدور گواهینامه نمیتوانستند بنا را بر اطمینان از عدم وقوع چنین اتفاقی بگذارند.
Let’s Encrypt ملزم بود آنچه را که اتفاق افتاده شفاف سازد و اقدامات انجامشده برای جلوگیری از بروز دوباره این مشکل را تشریح کند.
در این راستا تمام دامنههایی که در اثر این اتفاق بدون بررسیهای کافی تمدید شده بودند لغو گردید تا مجددا نام سرور با CAA برای آنها مطابقت داده شود. این کار بایست انجام میشد هرچند ۹۹٪ اطمینان در مورد بررسیها وجود داشت.
بنابراین ۳ میلیون گواهینامه باطل اعلام شدند.
چه باید کرد؟
در مرحله اول Let’s Encrypt به تمامی افرادی که دامنههای آنها تحت تاثیر قرار گرفت ایمیل ارسال کرد و آنها را در جریان روند تمدید قرار داد. جزییات بیشتر این ایمیلها و اطلاعات بیشتر دربارهی آنها در این صفحه قرار داده شده است. در این صفحه پیوندهایی وجود دارد که نشان میدهند چگونه می توانید یک لیست کامل از شماره سریال گواهیهای آسیب دیده را (در حدود ۳۰۰ مگابایت) به انضمام نام دامنهای که هر گواهینامه پوشش می دهد دریافت نمایید. با دانلود فایل و Extract کردن آن و بررسی فایل اصلی که در حدود ۱.۳ گیگابایت است میتوانید نام دامنه مورد نظر خود را جستجو کنید.
اگر دامنه شما تحت تاثیر قرار گرفته و تمدید نشده باشد درتاریخ ۱۴ اسفند از کار افتاده است، پس اگر وبسایت شما همچنان به صورت HTTPS در دسترس است بدین معنی است که مشکلی در گواهی امنیتی خود ندارید.
بر اساس شواهد، اگر شما دارای یک و فقط یک گواهی رمزگذاری از Let’s encrypt باشید، به احتمال زیاد این ایراد برای شما رخ نداده است، زیرا شما تاکنون سعی نکردهاید بیش از یک گواهی را به طور همزمان تمدید کنید.
گواهینامههای SSL در اَبر دِراک
امکان فعالسازی گواهینامه ابری SSL در اَبر دِراک برای تمام کاربران فراهم است و تمام گواهینامهها قبل از انقضا، به صورت خودکار تمدید میشوند. در زمان بروز هرگونه اختلال، اَبر دِراک به طور خودکار اقدام به رفع اختلال میکند. از این رو در جریان اختلال در سیستم Let’s Encrypt، تمام وبسایتها به موقع بررسی شده و بدون ایجاد مشکل، اختلال را پشت سر گذاردند.