درحال عرضه سنجاق کردن کلید عمومی با گزارش HPKP

استفاده از SSL در سایتتان روش مهمی برای حفظ امنیت و حریم خصوصی کاربران شما است. اما فعال کردن SSL پایان داستان نیست: مراحل زیادی وجود دارد که می‌توانید برای بهبود بیشتر امنیتی که سایتتان ارائه می‌دهد انجام دهید، از تنظیم ویژگی امن در کوکی‌هایتان تا روشن کردن امنیت انتقال شدید HTTP تا استفاده از خط‌مشی امنیت محتوا برای قفل کردن امتیازات سایتتان. بااین‌حال، پیاده‌سازی این ویژگی‌های قدرتمند گاهی اوقات می‌تواند دشوار باشد. برای کمک به شما در اجرای شکل سخت‌گیرانه‌تری از SSL،‏ Chrome 46 با ویژگی‌ای به‌نام گزارش HPKP عرضه می‌شود.

معنی این سرنام‌ها چیست؟

امروزه امنیت در وب به گواهینامه‌های SSL متکی است: امضاهای رمزنگاری‌شده‌ای که ثابت می‌کنند وب‌سایت همان چیزی است که ادعا می‌کند. وقتی مرورگر شما درخواستی به نشانی وبی مثل https://developers.google.com ارسال می‌کند، سرور گواهینامه SSL ارائه می‌دهد و اگر گواهینامه معتبر باشد، مرورگر اجازه می‌دهد درخواست ادامه یابد و نشانی وب‌سایت را با قفل سبز در نوار نشانی نشان می‌دهد.

اما گواهی معتبر چیست؟ برای اینکه گواهی معتبر درنظر گرفته شود، باید توسط مرجع صدور گواهی (CA) یا گواهی دیگری که توسط CA امضا شده است (به‌عنوان CA واسطه شناخته می‌شود) امضا شود. مرورگرها و سیستم‌عامل‌ها با فهرستی از چند صد «مرجع صدور گواهی» که برای صدور گواهی معتبر هستند عرضه می‌شوند. اما مشکل این است که به‌طور پیش‌فرض، هرکدام از این «مرجع‌های صدور گواهی» می‌توانند برای هر وب‌سایتی گواهی صادر کنند. اگر یکی از آن‌ها لو برود یا رفتار نادرستی داشته باشد، می‌تواند برای کل وب ویرانگر باشد.

سنجاق کردن کلید عمومی HTTP یا HPKP را وارد کنید. این استاندارد به وب‌سایت‌ها اجازه می‌دهد سرایند HTTP ارسال کنند که به مرورگر دستور می‌دهد بخش‌هایی از زنجیره گواهینامه SSL خود را به‌خاطر بسپارد (یا «سنجاق» کند). سپس مرورگر اتصال‌های بعدی را که با پین‌هایی که قبلاً دریافت کرده است مطابقت نداشته باشد رد می‌کند. در اینجا نمونه‌ای از سرصفحه HPKP آورده شده است:

Public-Key-Pins:  
       pin-sha256="d6qzRu9zOECb90Uez27xWltNsj0e1Md7GkYYkVoZWmM=";  
       pin-sha256="LPJNul+wow4m6DsqxbninhsWHlwfp0JecwQzYpOLmCQ=";  
       max-age=259200

این سرصفحه دو درهم‌ساز گواهی را به‌عنوان پین مشخص می‌کند. یکی درهم‌سازی گواهینامه در زنجیره گواهینامه سایت است و دیگری پین پشتیبان یا درهم‌سازی گواهینامه‌ای است که سایت می‌تواند درصورت نیاز به چرخش گواهینامه از آن استفاده کند. سرصفحه همچنین شامل مقدار max-age است. پس‌از گذشت این تعداد ثانیه، مرورگر پین را فراموش خواهد کرد.

برای اطلاعات بیشتر درباره HPKP به‌طور کلی، مشخصات یا پست وبلاگ عالی کریس پالمر، توسعه‌دهنده Chrome، را بررسی کنید.

آیا باید همین حالا HPKP را روشن کنم؟

نه لزوماً. وقتی HPKP را مستقر می‌کنید، خیلی راحت ممکن است اشتباه کنید و به‌طور تصادفی سایتتان را DoS کنید. اگر سایتتان را به یک مجموعه گواهینامه سنجاق کنید و سپس مجبور شوید گواهینامه جدیدی را مستقر کنید، کاربرانی که سنجاق را دیده‌اند نمی‌توانند تا زمان منقضی شدن سنجاق (براساس مقدار max-age در سرصفحه) به سایتتان دسترسی پیدا کنند.

چون HPKP پیچیده است، درحال‌حاضر بیشتر توسط تعداد کمی از سایت‌های مهم و حساس به امنیت استفاده می‌شود. اگر تصمیم گرفتید HPKP را روشن کنید، باید با مقدار max-age بسیار کوتاهی شروع کنید و اگر مشکلی نداشتید به‌تدریج آن را افزایش دهید.

گزارش HPKP چیست و چگونه کمک می‌کند؟

گزارش‌دهی HPKP، که در Chrome 46 ارائه می‌شود، ویژگی‌ای است که می‌توانید از آن برای شناسایی پیکربندی‌های اشتباه درحین عرضه HPKP استفاده کنید.

ابتدا می‌توانید به‌جای سرصفحه Public-Key-Pins، سرصفحه Public-Key-Pins-Report-Only را ارسال کنید:

Public-Key-Pins-Report-Only: 
       max-age=2592000;  
       pin-sha256="E9CZ9INDbd+2eRQozYqqbQ2yXLVKB9+xcprMF+44U1g=";  
       pin-sha256="LPJNul+wow4m6DsqxbninhsWHlwfp0JecwQzYpOLmCQ=";  
report-uri="https://example.net/pkp-report"

وقتی سایت شما چنین سرصفحه‌ای ارسال می‌کند، Chrome بررسی می‌کند که آیا اتصال فعلی با پین‌ها مطابقت دارد یا نه، و اگر مطابقت نداشته باشد، گزارشی به report-uri ارسال می‌کند. ‫Chrome هرگز درخواست‌ها را براساس پین‌های موجود در سرصفحه Report-Only مسدود نمی‌کند، بنابراین این روشی ایمن برای امتحان کردن HPKP است تا ببینید آیا برای کاربران شما مشکل ایجاد می‌کند یا نه، بدون اینکه خطر DoS شدن سایت شما وجود داشته باشد.

توجه داشته باشید که سرصفحه «فقط گزارش» فقط برای درخواستی اعمال می‌شود که در آن دریافت شده است. مرورگر پین‌های «فقط گزارش» را مانند پین‌های واقعی به‌خاطر نمی‌سپارد. این کار به شما امکان می‌دهد پیکربندی‌تان را بدون نگرانی درباره ذخیره شدن مقادیر بد در حافظه نهان مرورگرهای کاربران آزمایش کنید و می‌توانید به‌صورت افزایشی (مثلاً فقط در یک منبع) عرضه کنید تا سرورتان با گزارش‌ها پر نشود.

وقتی سرصفحه واقعی Public-Key-Pins را برای شروع اجرای پین‌هایتان عرضه می‌کنید، می‌توانید مقدار report-uri را نیز در آن سرصفحه اضافه کنید تا درصورت بروز هرگونه مشکل، همچنان گزارش دریافت کنید.

چه چیزی در گزارش نقض HPKP قرار می‌گیرد؟

گزارش نقض HPKP یک پیام JSON است که در درخواست HTTP POST به report-uri پیکربندی‌شده شما ارسال می‌شود. فهرست فیلدها را می‌توانید در مشخصات پیدا کنید، اما من دو مورد از آن‌ها را در اینجا برجسته می‌کنم: served-certificate-chain و validated-certificate-chain. served-certificate-chain گواهینامه دقیقاً همان‌طور است که Chrome هنگام راه‌اندازی اتصال SSL برای درخواست دریافت کرده است. ازسوی‌دیگر، validated-certificate-chain زنجیره‌ای است که Chrome هنگام تلاش برای اعتبارسنجی گواهی سرور بازسازی کرده است، که به‌طور شگفت‌انگیزی می‌تواند با served-certificate-chain متفاوت باشد. کلاینت‌های مختلف اعتبارسنجی گواهینامه را به روش‌های مختلفی انجام می‌دهند و این می‌تواند دلیل رایجی برای پیکربندی‌های اشتباه HPKP باشد. اگر گزارش‌های غیرمنتظره دریافت می‌کنید، حتماً این فیلد را بررسی کنید.

یک «نکته» نهایی

اگر گزارش‌دهی HPKP را مستقر می‌کنید، به‌خاطر داشته باشید که Chrome برای همه درخواست‌ها (ازجمله درخواست‌های ارسال گزارش) اعتبارسنجی پین انجام می‌دهد. بنابراین اگر HPKP را برای سایتتان مستقر کرده‌اید، احتمالاً می‌خواهید گزارش‌های HPKP را به دامنه دیگری که سنجاق نکرده‌اید ارسال کنید. درغیراین‌صورت، نقض پین در سایت شما باعث ارسال گزارش به همان دامنه می‌شود که آن هم نقض پین را رد می‌کند و بنابراین گزارش را دریافت نخواهید کرد.

اگر دامنه دیگری دردسترس ندارید، می‌توانید به‌جای آن از سرویسی مانند report-uri.io استفاده کنید که گزارش‌های نقض را برای شما مدیریت می‌کند.