اجرای پین کردن کلید عمومی با گزارش HPKP

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

همه این کلمات اختصاری به چه معناست؟

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

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

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

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

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

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

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

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

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

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

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

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

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 هرگز درخواست‌ها را بر اساس پین‌های یک سرصفحه فقط گزارش مسدود نمی‌کند، بنابراین این یک راه امن برای امتحان HPKP و بررسی اینکه آیا بدون خطر DoSing سایت شما باعث ایجاد مشکل برای کاربران شما می‌شود، است.

توجه داشته باشید که هدر فقط گزارش فقط برای درخواستی اعمال می شود که بر اساس آن دریافت شده است. مرورگر پین های Report-Only را مانند پین های واقعی به خاطر نمی آورد. این به شما امکان می‌دهد پیکربندی خود را بدون نگرانی در مورد ذخیره مقادیر بد در مرورگرهای کاربران خود آزمایش کنید، و می‌توانید به صورت تدریجی (مثلاً فقط در یک منبع) از پر کردن گزارش‌ها به سرور خود جلوگیری کنید.

هنگامی که هدر 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 را امتحان کنید که گزارش‌های تخلف را برای شما مدیریت می‌کند.