پیاده سازی SSL و استفاده از HSTS برای امنیت Net Core 2.0

در این مقاله ما می‌خواهیم نحوه ایجاد امنیت برای برنامه‌های Net Core. را بررسی کنیم. در اینجا نحوه اجرای SSL در برنامه‌های Net Core. را به همراه افزودن HSTS به سایت‌ ساخته شده با Net. مشاهده می‌کنیم. از Net Core 2.1. به بعد، HTTPS به طور پیش‌فرض در هر قالبی فعال شد که یکی از ویژگی‌های Net Core 2.1. است.

پیاده سازی SSL و استفاده از HSTS برای امنیت Net Core 2.0

SSL چیست؟

SSL  ( (Secure Sockets Layerیک پروتکل امنیتی استاندارد برای سازماندهی لینک‌های رمزنگاری شده بین وب‌سرور و مرورگر در ارتباطات آنلاین است.

استفاده از تکنولوژی SSL تضمین می‌کند که تمام داده‌های ارسال‌شده بین وب‌سرور و مرورگر به صورت رمزنگاری باقی می‌مانند، بنابراین امن هستند.

برای محافظت از برنامه‌های Net Core. خود، می‌توانید همین حالا مرورگر را با استفاده از HTTPS اجرا کنید.

HTTPS چیست؟

HTTPS (Hyper Text Transfer Protocol Secure) نسخه امن HTTP است، پروتکلی که داده‌ها را بین مرورگر شما و وب‌سایتی که به آن متصل هستید ارسال می‌کند. حرف ‘S’ در پایان HTTPS از ‘Secure’ به معنای امنیت گرفته شده است.

این به این معناست که تمام ارتباطات بین مرورگر شما و وب‌سایت رمزگذاری شده‌اند.

بیایید شروع کنیم.

پیش‌نیازها

Visual studio 2017 community را از اینجا دانلود کنید.

Net Core 2.0 SDK. را از اینجا دانلود کنید.

ایجاد یک برنامه MVC با استفاده از قالب Net Core 2.0. در ویژوال استودیو 2017

وقتی تمام این موارد نصب شد، ویژوال استودیو 2017 را باز کرده و این مراحل را طی کنید:

Create New Project -> Select Core Web application

روی Ok کلیک کرده و در پنجره بعدی، (Web Application(MVC را همان‌طور که در تصویر زیر نشان داده شده است انتخاب کنید.

ویژوال استودیو یک برنامه ساخت‌یافته را برای‌تان ایجاد خواهد کرد.

اعمال SSL روی کنترلر‌ها

اعمال SSL بر روی کنترلرها خیلی آسان است. فقط باید اتربیوت RequireHttps را بالای کنترلر اضافه کنید:

[RequireHttps]  
public class HomeController: Controller{} 

اعمال SSL به صورت سراسری

ممکن است کنترلرهای زیادی داشته باشید و نیاز به تغییر در کنترلرهای زیادی داشته باشید. رویکرد متفاوتی وجود دارد که می‌توانید با ایجاد تغییر در کلاس Startup.cs، SSL را به صورت سراسری اعمال کنید.

خط ذکر شده در زیر را در متد ConfigureService اضافه کنید:

    public void ConfigureServices(IServiceCollection services) {  
        services.AddMvc();  
        services.Configure < MvcOptions > (options => {  
            options.Filters.Add(new RequireHttpsAttribute());  
        });  
    }  

کد بالا نیاز به تمام درخواست‌ها برای استفاده از HTTPS دارد، بنابراین درخواست HTTP نادیده گرفته می‌شود.

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

هدایت HTTP به HTTPS

برنامه‌ها نیاز دارند تا هم به HTTP گوش دهند و هم به HTTPS، اما پس از آن لازم است همه ترافیک HTTP را به HTTPS هدایت کنند.

کد زیر را در متد Configure در کلاس Startup.cs اضافه کنید تا همه فراخوانی‌های HTTP به HTTPS هدایت شوند:

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)  
    {  
        var options = new RewriteOptions().AddRedirectToHttps(StatusCodes.Status301MovedPermanently, 63423);  
        app.UseRewriter(options);  
        app.UseMvc();  
    }  

اجرای برنامه بالا بر روی IIS Express

لطفا توجه داشته باشید که اگر برنامه فوق را روی IISExpress اجرا کنید، خطایی را خواهید دید.

این خطا به این دلیل است که شما هنوز تنظیمات IIS Express را برای تأیید SSL انجام نداده‌اید. باید SSL را فعال کنید.

برای این کار properties برنامه را باز کرده و تب Debug را باز کنید.

در تنظیمات Web Server، گزینه Enable SSL را تیک بزنید، همان‌طور که در تصویر زیر نشان داده شده است.

نکته: می‌توانید سورس کد ساده‌ این مثال را از اینجا دانلود کنید. (این مثال شامل تغییرات HSTS نیست).

HTTP Strict Transport Security (HSTS)

گاهی اوقات، فقط هدایت HTTP به HTTPS کافی نیست، بنابراین نیاز به چیزی داریم که می‌تواند مرورگرها را هدایت کند تا همیشه از طریق HTTPS به سایت دسترسی داشته باشند.

HSTS چیست؟

HSTS (HTTP Strict Transport Security) یک مکانیزم سیاست امنیتی وب است که به محافظت از وب‌سایت‌ها در برابر حملات به پروتکل و ربودن کوکی‌ها کمک می‌کند.

این مکانیزم اجازه می‌دهد تا وب‌سرورها اعلام کنند که مرورگرهای وب (یا سایر عوامل مجاز کاربر) باید فقط با استفاده از اتصالات امن HTTPS ارتباط برقرار کنند و هرگز از طریق پروتکل ناامن HTTP ارتباط برقرار نکنند.

به طور معمول فقط در سناریوهای non-dev استفاده می‌شود.

مثلا وقتی سعی می‌کنید با http://www.google.com به گوگل دسترسی پیدا کنیم، مرورگر به ما کد وضعیت 307  را می‌دهد و HTTP را به HTTPS هدایت می‌کند.

برای این کار، ما باید به برنامه بگوییم تا وقتی برای اولین بار برنامه مرورگر را باز می‌کند، هدر را به مرورگر ارسال کند:

Strict-Transport-Security: max-age=31536000

نکته مهم

تیم Net. اعلام کرده است که میان‌افزار (middleware) HSTS با Net Core 2.1.، حداکثر دوره (MaxAge)، زیردامنه‌ها (subdomain) و لیست پیش‌بارگذاری‌های (preload) HSTS را پشتیبانی می‌کند. در حال حاضر، هیچ دستورالعمل ساده‌ای برای نحوه استفاده از این مورد با Net Core 2.1. وجود ندارد، بنابراین ما از NWebSec برای HSTS استفاده می‌کنیم.

ما می‌توانیم کدی را به برنامه Net Core. اضافه کنیم که کارهای فوق را برای ما انجام می‌دهد.

NWebsec به شما اجازه می‌دهد تعداد معدودی از هدرهای امنیتی را به طور کامل تنظیم کنید.

NWebsec.AspNetCore.Middleware را از Nuget اضافه کنید.

هنگامی که پکیج Nuget نصب شد، کد زیر را در متد Configure اضافه کنید:

app.UseHsts(h=> h.MaxAge(days:365)  

سپس باید اطلاعات دامنه خود را به سایت  HSTS Preload ارسال کنید و پس از آن preload را همان‌طور که در زیر نشان داده شده است. اضافه کنید:

app.UseHsts(h=> h.MaxAge(days:365).preload());  

نکته مهم

توجه داشته باشید، هنگامی که این کار را انجام می‌دهید، مرورگر درخواست‌های ناامن دامنه شما را رد می‌کند، بنابراین فقط نسخه HTTPS سایت شما فراخوانی خواهد شد. اما به هر دلیلی اگر سایت شما در آینده https را پشتیبانی نکند، بعد از اینکه سایت خود را همانند مراحل بالا با HSTS تنظیم کردید، دیگر در دسترس نخواهد بود. پس با دقت از آن استفاده کنید.