اجبار به استفاده‌ی از HTTPS در حین توسعه‌ی برنامه‌های ASP.NET Core 2.1
اندازه‌ی قلم متن
تخمین مدت زمان مطالعه‌ی مطلب: سه دقیقه

پس از نصب SDK جدید NET Core 2.1. و ایجاد یک برنامه‌ی جدید بر اساس آن توسط دستور«dotnet new mvc» و سپس اجرای آن به کمک دستور «dotnet run»، تصویر جدیدی مشاهده می‌شود:


در نگارش‌های قبلی، پس از اجرای برنامه، صرفا یک سطر زیر نمایش داده می‌شد:
Now listening on: http://localhost:5000
اما اکنون تبدیل شده‌است به دو سطر که اولی HTTPS است و دومی HTTP معمولی:
Now listening on: https://localhost:5001
Now listening on: http://localhost:5000
یعنی برنامه بر روی دو پورت 5000 و یا 5001 قابل دسترسی است. در این حال اگر سعی کنیم برنامه را بر روی پورت 5000 که HTTP معمولی است اجرا کنیم، بلافاصله به خطای امن نبودن دسترسی به سایت و اجرای خودکار برنامه بر روی پورت 5001 خواهیم رسید:


علت هدایت خودکار به آدرس HTTPS، به تغییرات فایل آغازین برنامه بر می‌گردد:
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseExceptionHandler("/Home/Error");
        app.UseHsts();
    }

    app.UseHttpsRedirection();
در اینجا علاوه بر UseHsts ، تنظیم UseHttpsRedirection نیز به صورت پیش‌فرض قرار داده شده‌اند که سبب ارتقاء و همچنین هدایت خودکار به آدرس HTTPS برنامه می‌شوند. توضیحات بیشتری در مورد Hsts: «فعال‌سازی HSTS در ASP.NET Core» که با میان افزار جدید و توکار Hsts جایگزین می‌شود.
اگر خواستید این شماره‌ی پورت را تغییر دهید، می‌توانید به صورت زیر عمل کنید:
 services.AddHttpsRedirection(options => options.HttpsPort = 5002);
میان افزار جدید UseHsts به مرورگرها فرمان می‌دهد که این سایت را در حالت HTTPS مرور کنند. البته همانطور که مشاهده می‌کنید این مورد فقط برای حالت ارائه‌ی نهایی تنظیم شده‌است و نه حالت استفاده‌ی از برنامه در حالت localhost. جزئیات این میان‌افزار را به صورت زیر نیز می‌توان تنظیم کرد و یا تغییر داد:
services.AddHsts(options =>
{
    options.MaxAge = TimeSpan.FromDays(100);
    options.IncludeSubDomains = true;
    options.Preload = true;
});


اما چرا برنامه در حالت HTTPS قابل مشاهده نیست؟

پس از نصب SDK نگارش جدید NET Core.، یک مجوز SSL توسعه نیز به سیستم عامل اضافه می‌شود:
ASP.NET Core
------------
Successfully installed the ASP.NET Core HTTPS Development Certificate.

برای مشاهده‌ی این مجوز، دستور certmgr.msc را در قسمت run ویندوز وارد کرده و enter کنید:


این مجوز پیش فرض در قسمت «Personal/Certificates» با نام «ASP.NET Core HTTPS development certificate» قابل مشاهده‌است که در حقیقت یک Self Signed Certificate است و به صورت پیش فرض توسط سیستم معتبر و قابل اطمینان شناخته نمی‌شود.
برای اعلام قابل اطمینان بودن این مجوز به سیستم، در همین کنسول مدیریت مجوزها، بر روی این مجوز کلیک راست کرده و آن‌را کپی کنید. سپس آن‌را در مسیر «Trusted Root Certification Authorities/Certificates» قرار دهید (paste کنید).


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

روش دوم انجام اینکار، استفاده از دستور زیر است:
dotnet install tool dotnet-dev-certs -g --version 2.1.0-preview1-final
dotnet dev-certs https --trust
دستور اول برنامه‌ی dotnet-dev-certs را نصب می‌کند و دستور دوم آن‌را اجرا کرده و توسط پرچم trust، همان کار کپی و paste ذکر شده‌ی در قسمت قبلی را به صورت خودکار انجام خواهد داد. هرچند صفحه‌ی تائید این نقل و انتقال در اینجا نیز ظاهر می‌شود.


پس از اینکار اگر مرورگر را ریفرش کنید، باز هم همان خطای قبلی نمایش داده می‌شود. برای رفع این مشکل باید یکبار مرورگر را کاملا بسته و مجددا اجرا کنید تا مجوز جدید را دریافت کند:



تنظیمات مخصوص IIS Express برای اجرای برنامه‌های ASP.NET Core 2.1

دستور «dotnet run» از IIS برای اجرا استفاده نمی‌کند و مبتنی بر وب سرور Kestrel است. تنظیمات IIS و IIS Express از فایل Properties\launchSettings.json خوانده می‌شوند که اینبار به صورت زیر تغییر کرده‌است:
{
  "iisSettings": {
    "windowsAuthentication": false,
    "anonymousAuthentication": true,
    "iisExpress": {
      "applicationUrl": "http://localhost:4929",
      "sslPort": 44313
    }
  },
  "profiles": {
    "IIS Express": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development",
        "ASPNETCORE_HTTPS_PORT": "44313"
      }
    },
    "TestWebApp": {
      "commandName": "Project",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development",
        "ASPNETCORE_URLS": "https://localhost:5001;http://localhost:5000"
      }
    }
  }
}
در اینجا تنظیمات مربوط به sslPort و همچنین ASPNETCORE_HTTPS_PORT نیز اضافه شده‌اند که IIS Express از آن‌ها استفاده می‌کند.
  • #
    ‫۶ سال و ۲ ماه قبل، دوشنبه ۱۱ تیر ۱۳۹۷، ساعت ۲۱:۱۱
    سلام 
    برای publish کردن پروژه بر روی IIS ، که به این روش از https استفاده می‌کند نیاز به انجام تنظیمات SSL , Certificate در IIS دارد؟
    من binding وبسایت رو تغیر دادم تا از یکی از certificate‌های نصب شده استفاده کند، اما مرورگر خطای safe نبودن صفحه را می‌دهد؟

    همچنین SSL Settings رو هم بر روی وبسایت در IIS فعال کردم که در حالت Required خطای access denied می‌دهد
    • #
      ‫۶ سال و ۲ ماه قبل، دوشنبه ۱۱ تیر ۱۳۹۷، ساعت ۲۱:۱۶
      « ... مرورگر خطای safe نبودن صفحه را می‌دهد ...»
      چون این‌ها self signed certificated هستند و نه مجوز واقعی. قرار دادن آن‌ها در مسیر «Trusted Root Certification Authorities/Certificates» که در متن توضیح داده شد، فقط بر روی سیستم شخصی شما برای آزمایش برنامه کار می‌کند و نه در سیستم دیگری در شبکه.
      • #
        ‫۶ سال و ۱ ماه قبل، چهارشنبه ۱۰ مرداد ۱۳۹۷، ساعت ۱۹:۴۹
        اگر خواسته باشیم روی شبکه محلی سایت رو با https بیاریم بالا و کاربرای دیگه certificate رو نصب نکنند یا اینکه به صورت خودکار رو سیستمشون نصب بشه چه کار باید کرد؟ 
      • #
        ‫۵ سال و ۳ ماه قبل، چهارشنبه ۲۲ خرداد ۱۳۹۸، ساعت ۱۷:۳۸
        اگر با قرار دادن مجوز‌ها در مسیر  «Trusted Root Certification Authorities/Certificates»  باز هم خطای امن نبودن کانکشن دریافت شود، چه راهی برای حل این مشکل  در سیستم شخصی  وجود دارد؟
        • #
          ‫۵ سال و ۳ ماه قبل، چهارشنبه ۲۲ خرداد ۱۳۹۸، ساعت ۱۸:۴۱
          این‌ها تاریخ مصرف دارند. یکبار موارد صادر شده را حذف کنید و بعد با دستوراتی که در نظرات عنوان شده، مجددا آن‌ها را تولید کنید.
  • #
    ‫۶ سال و ۱ ماه قبل، دوشنبه ۲۹ مرداد ۱۳۹۷، ساعت ۱۷:۴۶
    یک نکته‌ی تکمیلی: منقضی شدن مجوز آزمایشی
    اگر مجوز آزمایشی مطرح شده‌ی در این مطلب منقضی شود، یک چنین پیام خطایی را با اجرای dotnet run دریافت خواهید کرد:
    System.InvalidOperationException: Unable to configure HTTPS endpoint. No server certificate was specified, and the default developer certificate could not be found.
    To generate a developer certificate run 'dotnet dev-certs https'. To trust the certificate (Windows and macOS only) run 'dotnet dev-certs https --trust'.
    For more information on configuring HTTPS see https://go.microsoft.com/fwlink/?linkid=848054.
    و یا حتی با نصب یک نگارش جدید SDK ممکن است خطای زیر را در مرورگر مشاهده کنید:
    Secure Connection Failed
    An error occurred during a connection to localhost:5001. Certificate key usage inadequate for attempted operation.
    Error code: SEC_ERROR_INADEQUATE_KEY_USAGE
    برای رفع آن دو دستور زیر را با دسترسی مدیریتی صادر کنید:
    dotnet dev-certs https --clean
    dotnet dev-certs https --trust
    دستور اول مجوز موجود را حذف می‌کند و دستور دوم مجوز جدیدی را تولید و نصب خواهد کرد.
    پس از اجرای این دستورات، هم برنامه و هم مرورگر را باید یکبار بسته و بار دیگر از ابتدا اجرا کنید؛ تا مجوزهای جدید را دریافت کنند.
  • #
    ‫۵ سال و ۱۱ ماه قبل، پنجشنبه ۵ مهر ۱۳۹۷، ساعت ۱۸:۵۵
    یک نکته‌ی تکمیلی: در نسخه جدید sdk
    خط فرمان:
    dotnet install tool dotnet-dev-certs -g --version 2.1.0-preview1-final

    به:
    dotnet tool install dotnet-dev-certs -g

  • #
    ‫۵ سال و ۸ ماه قبل، پنجشنبه ۲۷ دی ۱۳۹۷، ساعت ۱۵:۴۵
    یک نکته تکمیلی:
    فقط می‌توانید با همین دستورات، مجوز را امن کنید:
    dotnet dev-certs https --clean
    dotnet dev-certs https --trust

  • #
    ‫۴ سال و ۱۱ ماه قبل، یکشنبه ۲۱ مهر ۱۳۹۸، ساعت ۱۱:۱۱
    با سلام؛ من نسخه dotnet-sdk-2.2.402-win-x64 را روی ویندوز سرور نصب میکنم و از دستور certmgr.msc برای دیدنش استفاده می‌کنم؛ چیزی رو نمایش نمیده. ولی روی سیستم خودم درست نصب شده، مشکل روی سرور هست. آیا روی سرور تنظیم خاصی رو باید انجام بدم؟ از دستور dotnet --info استفاده میکنم، میگه sdk نصب نیست؛ در صورتی که نصب هست.
      >dotnet --in
    
    Host (useful for support):
      Version: 2.2.7
      Commit:  b1e29ae826
    
    .NET Core SDKs installed:
      No SDKs were found.
    
    .NET Core runtimes installed:
      Microsoft.AspNetCore.All 2.2.5 [C:\Program Files (x86)\dotnet\shared\Microsoft.AspNetCore.All]
      Microsoft.AspNetCore.All 2.2.7 [C:\Program Files (x86)\dotnet\shared\Microsoft.AspNetCore.All]
      Microsoft.AspNetCore.App 2.2.5 [C:\Program Files (x86)\dotnet\shared\Microsoft.AspNetCore.App]
      Microsoft.AspNetCore.App 2.2.7 [C:\Program Files (x86)\dotnet\shared\Microsoft.AspNetCore.App]
      Microsoft.NETCore.App 2.2.5 [C:\Program Files (x86)\dotnet\shared\Microsoft.NETCore.App]
      Microsoft.NETCore.App 2.2.7 [C:\Program Files (x86)\dotnet\shared\Microsoft.NETCore.App]
    
    To install additional .NET Core runtimes or SDKs:
      https://aka.ms/dotnet-download
      • #
        ‫۴ سال و ۱۰ ماه قبل، یکشنبه ۲۸ مهر ۱۳۹۸، ساعت ۱۴:۵۴
        با سلام؛ زمان site binding قسمت ssl certificate روی iis، گزینه ASP.NET Core HTTPS development certificate وجود ندارد. در صورتیکه روی certmgr وجود دارد و Trust  شده است. چطوری به iis اضافه شود تا بتونم تو بایندینگ سایت استفاده کنم؟ ممنون
         

        • #
          ‫۴ سال و ۱۰ ماه قبل، یکشنبه ۲۸ مهر ۱۳۹۸، ساعت ۱۵:۲۵
          - در کجا استفاده شود؟ برای شبکه‌ی داخلی؟ قابل استفاده نیست؛ مگر اینکه تک تک کلاینت‌های ریموت، مجوز خود امضا شده‌ی شما را دستی دریافت، دستی نصب و دستی مورد اطمینان اعلام کنند.
          - مجوز خود امضاء شده‌ای که قرار است در این قسمت ظاهر شود، باید به این صورت توسط برنامه‌ی openssl تولید شود:
          "C:\Program Files\Git\usr\bin\openssl.exe" genrsa -out private.key 2048
          "C:\Program Files\Git\usr\bin\openssl.exe" req -new -x509 -key private.key -out publickey.cer -days 1398
          "C:\Program Files\Git\usr\bin\openssl.exe" pkcs12 -export -out idp.pfx -inkey private.key -in publickey.cer
          و بعد هم فایل pfx نهایی آن در local machine نصب شود (دوبار کلیک بر روی آن) و یا «یک نکته‌ی تکمیلی: UseHttpSys و استفاده‌ی از HTTPS»
  • #
    ‫۴ سال و ۷ ماه قبل، چهارشنبه ۲ بهمن ۱۳۹۸، ساعت ۱۴:۱۵
    با سلام؛ زمانی که سایت بر روی هاست روی اینترنت قرار داره باید چه کار کرد که صفحه در حالت Https قابل مشاهده باشه و هشداری به کاربر ارسال نشه؟ آیا این تنظیمات باید در کنترل پنل هاست انجام بشه یا باید تغییرات در اپلیکشین خودمون اعمال کنیم؟