HTTPS in ASP.NET Core from Scratch

onlangs, bij het bekijken van hoe authenticatie te configureren met behulp van externe aanmeldproviders (bijvoorbeeld Google, Facebook) met ASP.NET Core ik merkte dat https is nu een vereiste voor een aantal van hen.

een ander ding dat me opviel was hoe moeilijk het was om bronnen te vinden over het inschakelen van HTTPS op ASP.NET kern.

deze blogpost gaat over het proces van het creëren van een lokale ASP.NET Core website draait met HTTPS zonder fouten in Chrome (met het groene hangslot in de adresbalk) voor uw lokale ontwikkelingstijd. En dan hoe je Nginx of IIS kunt gebruiken als je klaar bent om het aan de wereld bloot te stellen.

HTTPS ASP.NET CORE

om HTTPS te kunnen gebruiken hebben we een digitaal certificaat nodig. Als u uw eigen certificaten moet genereren om te gebruiken tijdens de ontwikkeling, raad ik u aan om OpenSSL te gebruiken om certificaten te maken. Het legt niet alleen uit hoe u uw eigen certificaatautoriteit en certificaten kunt maken, maar ook hoe u uw browser (Chrome of Firefox) kunt configureren om de certificaatautoriteit te vertrouwen.

Als u ook wilt begrijpen wat de rol is van certificaten in HTTPS, kijk dan eens naar een korte(ish) uitleg van hoe https werkt.

vanaf nu ga ik ervan uit dat u uw certificaat authoriteit, certificaat en bijbehorende privésleutel hebt gegenereerd en dat u een .pfx (Personal Information Exchange) bestand.

Maak een nieuw project

Ik zal het proces beschrijven met behulp van Visual Studio Code en Yeoman.

als u niet bekend bent met yeoman, is het een opdrachtregelprogramma waarmee u nieuwe projecten kunt maken uit een lijst met projectsjablonen. De yeoman generator (dat is de naam van het pakket voor yeoman dat de sjablonen bevat) die we gaan gebruiken is generator-aspnet. Om yeoman te installeren heb je eerst npm nodig en dan kun je de instructies voor het installeren van yeoman en de ASP.NET Kernsjablonen hier.

de reden voor het gebruik van Visual Studio Code en yeoman is dat dit proces werkt op Windows, Linux en macOS.

om yeoman te gebruiken met de ASP.NET Core templates voer het volgende commando uit:

$ yo aspnet _-----_ ╭──────────────────────────╮ | | │ Welcome to the │ |--(o)--| │ marvellous ASP.NET Core │`---------´ │ generator! │ ( _´U`_ ) ╰──────────────────────────╯ /___A___\ / | ~ | __'.___.'__ ´ ` |° ´ Y ` ? What type of application do you want to create? (Use arrow keys)❯ Empty Web Application Empty Web Application (F#) Console Application Console Application (F#) Web Application Web Application Basic Web Application Basic (F#) 

Selecteer lege webtoepassing. Een eenvoudig web project zal worden gemaakt dat net pagina met de tekst “Hello World”heeft.

Als u Windows draait en de volledige versie van Visual Studio heeft, kunt u gewoon bestand -> nieuw Project doen, selecteer. net Core, ASP.NET Core webapplicatie en selecteer vervolgens leeg.

https configureren voor Kestrel

Kestrel is de webserver die standaard wordt gebruikt met ASP.NET kern.

om HTTPS-ondersteuning aan Kestrel toe te voegen, voeg het Microsoft.AspNetCore.Server.Kestrel.Https – pakket toe als een afhankelijkheid.

Als u project gebruikt.json u kunt dit doen door project te bewerken.JSON ‘s” afhankelijkheden ” sectie en toevoegen:

"Microsoft.AspNetCore.Server.Kestrel.Https": "1.1.0"

het versienummer kan voor u anders zijn, maar het moet hetzelfde zijn als het nummer dat in het Microsoft.AspNetCore.Server.Kestrel pakket wordt gebruikt.

als u .csproj gebruikt, kunt u de afhankelijkheid toevoegen door het uitvoeren van:

dotnet add package Microsoft.AspNetCore.Server.Kestrel.Https

Certificaatconfiguratie

om Kestrel te configureren om onze te gebruiken .pfx-bestand (certificaat en privésleutel) we moeten Program.cs bewerken waar WebHostBuilder wordt aangemaakt en enkele wijzigingen aanbrengen:

var host = new WebHostBuilder() .UseConfiguration(config) .UseKestrel(options => { options.UseHttps("localhost.pfx", "password"); }) .UseContentRoot(Directory.GetCurrentDirectory()) .UseIISIntegration() .UseUrls("https://*:4430") .UseStartup<Startup>() .Build();

de veranderingen zijn:

.UseKestrel(options => { options.UseHttps("localhost.pfx", "password");})

dat is waar we specificeren wat het is .pfx-bestand dat we willen gebruiken en het wachtwoord. UseHttps is een uitbreidingsmethode, als u een fout krijgt die zegt dat het niet bestaat, is dat omdat u het Microsoft.AspNetCore.Server.Kestrel.Https NuGet-pakket niet hebt toegevoegd, waar het zich bevindt.

ook:

.UseUrls("https://*:4430")

die bepaalt waar Kestrel zal luisteren naar inkomende verbindingen. U kunt ook https://localhost:4430 gebruiken in plaats van *. Met * kunt u echter elke domeinnaam gebruiken, bijvoorbeeld als u deze webtoepassing in myDomain.com heeft, zou het nog steeds werken, terwijl met localhost alleen aanvragen naar localhost worden ingediend.

in het geval je je afvraagt waarom ik de Standaard HTTPS poort niet heb gebruikt, 443, dat is omdat je speciale rechten nodig hebt op Linux voor poorten onder 1024. In Windows zou dit geen probleem zijn. Echter, omdat dit doen met Torenvalk alleen wordt aanbevolen als je in ontwikkeling bent, is het geen groot probleem.

als u dit probeert in Linux, macOS of via de opdrachtregel in Windows kunt u dotnet run aanroepen, Chrome openen en naar https://localhost:43000 gaan en een groen hangslotpictogram zien.

als u full Visual Studio in Windows gebruikt, kunt u dit doen door op te geven dat u de webtoepassing direct wilt uitvoeren en niet via IIS Express:

Selecteer de toepassing in de run opties

Selecteer ook de browser die u wilt proberen. Als u de installatie van uw test root certificate authority certificaat in een specifieke browser gebruiken die in de browser, bijvoorbeeld Chrome (als je in de war door deze verklaring, raad ik lees je Brief(ish) uitleg van de werking van https werkt en met Behulp van OpenSSL voor het Maken van Certificaten):

Selecteer ' Chrome als de browser te proberen de applicatie op

tot slot, het bewerken van de project eigenschappen(klik rechts en kies eigenschappen):

klik met de Rechtermuisknop en selecteer eigenschappen

En verander de start-url:

wijzig de opstart-url

met ASP.NET Core met een reverse proxy

hoewel het zeker mogelijk is om een webapplicatie te bedienen met ASP.NET kern die alleen Torenvalk gebruikt, wordt niet aanbevolen. Dit komt omdat Kestrel geen volledig uitgeruste webserver is en nog steeds een aantal beveiligingsfuncties mist.

hoewel het niet wordt aanbevolen, wilt u misschien gewoon iets laten zien wat u iemand hebt aangedaan en het deel van het installeren en configureren van een webserver overslaan. Met diensten zoals DigitalOcean of Linode kunt u een VPS in zeer korte tijd te creëren en gewoon uw ASP.NET Core beschikbaar via daar alleen hoeft te installeren. net core.

echter, als u iets ernstigers wilt (en dat doet u waarschijnlijk omdat u hier bent vanwege het inschakelen van HTTPS) moet u een volledig uitgeruste webserver gebruiken, zoals Nginx of IIS (in Windows), als een reverse proxy voor uw ASP.NET Kerntoepassing.

een reverse-proxyserver is een webserver die aanvragen accepteert en stuurt naar een andere webserver die de antwoorden voor deze aanvragen maakt. De antwoorden worden teruggestuurd naar de proxyserver die ze doorstuurt naar de clients die de bijbehorende verzoeken hebben uitgegeven.

met Nginx als reverse proxy zou het er ongeveer zo uitzien:

Browser <----> Nginx <----> Kestrel

het goede ding over deze setup is dat we kunnen profiteren van Nginx (of IIS) zijn een volledige webserver en inschakelen HTTPS op het:

Browser <---- HTTPS ---> Nginx <---- HTTP ----> Kestrel

dus hoeven we Kestrel niet eens te configureren met HTTPS, alleen Nginx.

https configureren met Nginx

eerst moet u Nginx installeren. Ik gebruik Ubuntu 16.04 voor dit, maar je kunt het zelfs installeren op Windows.

als Ubuntu wordt uitgevoerd, open een terminal en typ

$ sudo apt-get install nginx

het volgende wat we moeten doen is de configuratie van Nginx bewerken. Maar voordat we dat doen is het handig om te weten wat de locatie van de configuratiebestanden is en hoe ze worden ingeschakeld. De map waar de configuratie bestanden gewoonlijk geplaatst worden is /etc/nginx/sites-available/ (deze locatie kan anders zijn als je een andere Linux distributie gebruikt).

het configuratiebestand dat aanwezig is wanneer u Nginx installeert, heeft de naam default.

wil een Nginx-configuratie ingeschakeld worden, dan moet deze zich in de map /etc/nginx/sites-enabledbevinden. Dus na het aanmaken van een nieuw configuratiebestand (in sites-available) wordt een symbolische link aangemaakt in sites-enabled die naar het nieuwe bestand wijst.

stel je voor dat we net een nieuw configuratiebestand hadden aangemaakt met de naam my-site-https in sites-available. Daarna gaat u naar de map sites-enabled en voert u het volgende commando uit om een symbolische verwijzing te maken:

$ ln -s /etc/nginx/sites-available/my-site-htts

om Nginx deze nieuwe configuratie te laten lezen, voer je het commando:

$ sudo nginx -s reload

nu we weten hoe we Nginx-configuraties moeten maken en inschakelen, maken we het configuratiebestand voor het instellen van Nginx als een reverse proxy naar een ASP.NET Kerntoepassing die draait op http://localhost:5000.

maak eerst een nieuw bestand aan in /etc/nginx/sites-available met de naam, bijvoorbeeld aspnetcore, met de volgende inhoud:

server { listen 443 ssl; ssl_certificate PATH_TO_CERTIFICATE/CERTIFICATE_NAME.pem; ssl_certificate_key PATH_TO_PRIVATE_KEY/PRIVATE_KEY.pem; location / { proxy_pass http://localhost:5000; }}

hier configureren we Nginx naar listen naar poort 443 met behulp van SSL (443 is de standaard voor HTTPS). Vervolgens specificeren we waar het certificaat (ssl_certificate) en de private sleutel (ssl_certificate_key) zich bevinden en tot slot geven we Nginx de opdracht om alle verzoeken (location / zal overeenkomen met alle verzoeken) door te sturen naar http://localhost:5000.

maak tenslotte de symbolische link naar dit bestand in sites-enabled (u kunt de link naar het default bestand verwijderen, dit zal het originele bestand niet verwijderen omdat het een symbolische link is).

/etc/nginx/sites-enabled$ sudo ln -s /etc/nginx/sites-available/aspnetcore

om Nginx Deze configuratie te laten laden:

$ sudo nginx -s reload

Als u uw ASP.NET Core applicatie draait op http://localhost:5000 je zou nu in staat moeten zijn om https://localhost te openen en te zien dat het wordt bediend via HTTPS.

er is een veelvoorkomend probleem dat kan optreden wanneer u de Nginx configuratie herlaadt, namelijk dat u om een wachtwoord wordt gevraagd. Specifiek voor het wachtwoord van de privésleutel. Dit is misschien niet praktisch voor u, dus als u het wachtwoord van de private sleutel wilt verwijderen, kunt u het volgende commando uitvoeren:

$ openssl rsa -in privateKeyWithPassword.pem -out privateKeyWithoutPassword.pem

een ander handig ding dat je kunt doen met Nginx is om alle verzoeken om HTTP worden doorgestuurd naar HTTPS. Als u dit wilt inschakelen, voeg dan deze extra configuratie toe aan het aspnetcore Nginx configuratiebestand:

server { listen 80; return 301 https://$host$request_uri;}

Configuring Supervisor

een ding waar we ons zorgen over moeten maken is dat we onze ASP.NET Core webapplicatie draait.

er is een tool genaamd supervisor die ons in staat stelt om te configureren dat een toepassing moet worden gestart tijdens het opstarten, en als het crasht, moet het back-up

het eerste wat we moeten doen is het installeren. Ik gebruik Ubuntu 16.04 voor dit, en in deze distributie installeren is heel eenvoudig:

$ sudo apt-get install supervisor

het volgende wat we moeten doen is een supervisor configuratiebestand maken voor onze webapplicatie. Laten we het aspnetcore.conf noemen en het toevoegen aan /etc/supervisor/conf.d (je moet dit doen met sudo):

plaats dit in het configuratiebestand:

command=/usr/bin/dotnet PATH_TO_YOUR_PUBLISHED_PROJECT/YOURWEBAPP.dlldirectory=PATH_TO_YOUR_PUBLISHED_PROJECTautostart=trueautorestart=truestdout_logfile=/var/log/aspnetcore.out.logstderr_logfile=/var/log/aspnetcore.err.logenvironment=ASPNETCORE_ENVIRONMENT="Production"

de eerste regel definieert de naam (aspnetcore) waarmee we naar de webapplicatie kunnen verwijzen in supervisor.

de regel met command definieert het uit te voeren commando. In dit geval is het dotnet gevolgd door de dll van uw webapplicatie. Dit is gelijk aan het draaien van dotnet run in de root van uw project.

de volgende regel (directory=) stelt de werkmap in als degene waar uw project zich bevindt.

autostart=true betekent dat de toepassing tijdens het opstarten zal worden gestart.

autorestart=true betekent dat de toepassing opnieuw wordt gestart als het crasht of zelfs als het wordt gestopt (bijvoorbeeld met kill). Als u wilt dat uw toepassing alleen opnieuw gestart wordt in geval van een crash, verander het dan naar autorestart=unexpected.

de volgende twee regels bepalen naar welke bestanden de standaard en foutuitvoer respectievelijk worden geschreven.

tenslotte staat environment ons toe om omgevingsvariabelen in te stellen, in dit geval zetten we ASPNETCORE_ENVIRONMENT=Productionin.

voer de volgende commando ‘ s uit om dit nieuwe configuratiebestand in te schakelen:

$ sudo supervisorctl reread$ sudo supervisorctl update

u kunt de status van de processen die onder supervisor worden uitgevoerd controleren door

$ sudo supervisorctl

het moet iets dergelijks tonen als:

aspnetcore RUNNING pid 18817, uptime 0:05: 29
supervisor>

er zijn meer commando ’s die u kunt gebruiken om de processen onder supervisor te beheren, typ help Voor een lijst met beschikbare commando’ s. Typ quitom af te sluiten.

https configureren met IIS

de eerste stap in het inschakelen van HTTPS tijdens het gebruik van IIS is het installeren van ons certificaat en private key (met behulp van een .pfx-bestand dat beide bevat).

Open IIS-beheer en selecteer servercertificaten

open servercertificaten in IIS

klik op Certificaat importeren:

import certificate

Selecteer het.pfx-bestand en voer het bijbehorende wachtwoord in, verlaat de winkel als persoonlijk:

Selecteer pfx en voer wachtwoord

in voordat we verder gaan is het belangrijk om te vermelden dat u de ASP.NET kernmodule geïnstalleerd. Het is zeer waarschijnlijk dat je al doen, omdat het is geïnstalleerd voor u wanneer u de. net Core SDK installeren.

echter, in het geval dat dit niet het geval is (U kunt dit verifiëren in IIS-beheer door Modules te openen en te controleren of AspNetCoreModule daar wordt weergegeven), kunt u hier installatieinstructies vinden en een directe link voor het downloaden van de ASP.NET Core Server Hosting bundel hier.

wat deze module doet is om uw ASP.NET Core website en laat het draaien (herstarten als het crasht). Deze module is ook verantwoordelijk voor het doorsturen van de HTTP-verzoeken naar uw web app en vervolgens de reacties terug te sturen naar de client.

een belangrijk ding om te weten over de AspNetCoreModule is dat het is geconfigureerd door het web.config bestand in de root van uw project. U moet dotnet publish uitvoeren op uw project om web.config correct in te stellen in uw publicatiemap.

de volgende stap is het maken van een nieuwe groep van toepassingen en selecteer Geen beheerde Code als de.net CLR-versie. Normaal gesproken worden de websites uitgevoerd in een IIS-werkproces, maar in. net-kern worden ze uitgevoerd als een afzonderlijk proces, dus er is geen noodzaak voor een. net-Runtime in de app-pool:

Maak een nieuwe groep van toepassingen

ten slotte maken we een nieuwe website binnen IIS voor onze ASP.NET Kerntoepassing. We moeten de app pool die we zojuist hebben gemaakt selecteren, Selecteer als het fysieke pad het pad naar de gepubliceerde website, selecteer HTTPS als de binding en ons certificaat in de SSL certificaat dropdown:

Maak een nieuwe website

u kunt nu https gebruiken om naar uw ASP.NET Core app.

It ‘ s only fair to share…Delen op Facebook

Facebook

Tweet over dit op Twitter

Twitter

Delen op LinkedIn

Linkedin

Geef een antwoord

Het e-mailadres wordt niet gepubliceerd.