HTTPS in ASP.NET Core von Grund auf neu

Kürzlich, als ich mir ansah, wie man die Authentifizierung mit externen Login-Providern (z. B. Google, Facebook) mit ASP.NET Aber ich habe festgestellt, dass https für einige von ihnen jetzt eine Anforderung ist.

Eine andere Sache, die mir aufgefallen ist, war, wie schwierig es war, Ressourcen zum Aktivieren von HTTPS auf ASP.NET Kern.

In diesem Blogbeitrag geht es um das Erstellen eines lokalen ASP.NET Core-Website läuft mit HTTPS ohne Fehler in Chrome (zeigt das grüne Vorhängeschloss in der Adressleiste) für Ihre lokale Entwicklungszeit. Und dann, wie Sie Nginx oder IIS verwenden können, wenn Sie bereit sind, es der Welt zugänglich zu machen.

HTTPS ASP.NET CORE

Um HTTPS verwenden zu können, benötigen wir ein digitales Zertifikat. Wenn Sie Ihre eigenen generieren müssen, um sie zur Entwicklungszeit zu verwenden, empfehle ich die Verwendung von OpenSSL zum Erstellen von Zertifikaten. Es wird nicht nur erläutert, wie Sie Ihre eigene Zertifizierungsstelle und Zertifikate erstellen können, sondern auch, wie Sie Ihren Browser (Chrome oder Firefox) so konfigurieren können, dass er der Zertifizierungsstelle vertraut.

Wenn Sie die Rolle von Zertifikaten in HTTPS verstehen möchten, lesen Sie eine kurze (ish) Erklärung zur Funktionsweise von https.

Von nun an gehe ich davon aus, dass Sie Ihre Zertifizierungsstelle, Ihr Zertifikat und den entsprechenden privaten Schlüssel generiert haben und eine haben.pfx-Datei (Personal Information Exchange).

Neues Projekt erstellen

Ich werde den Prozess mit Visual Studio Code und Yeoman beschreiben.

Wenn Sie mit Yeoman nicht vertraut sind, ist es ein Befehlszeilentool, mit dem Sie neue Projekte aus einer Liste von Projektvorlagen erstellen können. Der Yeoman-Generator (so heißt das Paket für Yeoman, das die Vorlagen enthält), den wir verwenden werden, ist generator-aspnet. Um yeoman zu installieren, benötigen Sie zuerst npm und dann können Sie den Anweisungen zur Installation von yeoman und dem ASP.NET Kernvorlagen hier.

Der Grund für die Verwendung von Visual Studio Code und Yeoman ist, dass dieser Prozess unter Windows, Linux und macOS funktioniert.

yeoman mit dem ASP.NET Führen Sie den folgenden Befehl aus:

$ 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#) 

Wählen Sie Leere Webanwendung aus. Es wird ein einfaches Webprojekt erstellt, das nur eine Seite mit dem Text „Hallo Welt“ enthält.

Wenn Sie Windows ausführen und die Vollversion von Visual Studio haben, können Sie einfach Datei -> Neues Projekt, wählen Sie .Net Core, ASP.NET Core Web Application und wählen Sie dann Empty.

HTTPS für Turmfalke konfigurieren

Turmfalke ist der Webserver, der standardmäßig mit ASP.NET Kern.

Um HTTPS-Unterstützung zu Kestrel hinzuzufügen, fügen Sie das Paket Microsoft.AspNetCore.Server.Kestrel.Https als Abhängigkeit hinzu.

Wenn Sie project verwenden.json Sie können dies tun, indem Sie das Projekt bearbeiten.Abschnitt „Abhängigkeiten“ von json und Hinzufügen:

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

Die Versionsnummer kann für Sie unterschiedlich sein, sollte jedoch mit der im Paket Microsoft.AspNetCore.Server.Kestrel verwendeten übereinstimmen.

Wenn Sie .csproj verwenden, können Sie die Abhängigkeit hinzufügen, indem Sie Folgendes ausführen:

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

Zertifikatskonfiguration

So konfigurieren Sie Kestrel für die Verwendung unserer .pfx-Datei (Zertifikat und privater Schlüssel) Wir müssen Program.cs bearbeiten, wo WebHostBuilder erstellt wird, und einige Änderungen vornehmen:

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

Die Änderungen sind:

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

Welches ist, wo wir angeben, was die .pfx-Datei, die wir verwenden möchten, und ihr Passwort. UseHttps ist eine Erweiterungsmethode, wenn Sie eine Fehlermeldung erhalten, dass es nicht existiert, weil Sie das Microsoft.AspNetCore.Server.Kestrel.Https Nuget-Paket nicht hinzugefügt haben, wo es lebt.

Auch:

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

Definiert, wo Turmfalke auf eingehende Verbindungen wartet. Alternativ können Sie https://localhost:4430 anstelle von * . Mit * können Sie jedoch einen beliebigen Domainnamen verwenden, z. B. wenn Sie diese Webanwendung in myDomain.com haben, würde sie immer noch funktionieren, während mit localhost nur Anfragen an localhost bearbeitet würden.

Falls Sie sich fragen, warum ich nicht den Standard-HTTPS-Port 443 verwendet habe, liegt das daran, dass Sie unter Linux spezielle Berechtigungen für Ports unter 1024 benötigen. In Windows wäre das kein Problem. Da dies jedoch nur mit Turmfalken empfohlen wird, wenn Sie sich zur Entwicklungszeit befinden, ist dies kein großes Problem.

Wenn Sie dies unter Linux, macOS oder über die Befehlszeile unter Windows versuchen, können Sie dotnet run aufrufen, Chrome öffnen und zu https://localhost:43000 gehen und ein grünes Vorhängeschlosssymbol sehen.

Wenn Sie das vollständige Visual Studio in Windows verwenden, geben Sie an, dass Sie die Webanwendung direkt und nicht über IIS Express ausführen möchten:

 Wählen Sie die Anwendung in den Ausführungsoptionen

Wählen Sie auch den Browser aus, mit dem Sie sie anprobieren möchten. Wenn Sie das Zertifikat Ihrer Teststammzertifizierungsstelle in einem bestimmten Browser installiert haben, verwenden Sie diesen Browser, z. B. Chrome (wenn Sie durch diese Anweisung verwirrt sind, empfehle ich Ihnen, eine kurze (ish) Erklärung zur Funktionsweise von https und zur Verwendung von OpenSSL zum Erstellen von Zertifikaten zu lesen):

 Wählen Sie Chrome als Browser aus, um die Anwendung auf

zu testenBearbeiten Sie abschließend die Projekteigenschaften (klicken Sie mit der rechten Maustaste und wählen Sie Eigenschaften):

 Klicken Sie mit der rechten Maustaste und wählen Sie Eigenschaften

Und ändern Sie die Start-URL:

Ändern Sie die Start-URL

Mit ASP.NET Core mit einem Reverse Proxy

Obwohl es sicherlich möglich ist, eine Webanwendung mit ASP.NET Wenn Sie nur Turmfalken verwenden, wird dies nicht empfohlen. Dies liegt daran, dass Kestrel kein voll ausgestatteter Webserver ist und noch einige Sicherheitsfunktionen fehlen.

Auch wenn dies nicht empfohlen wird, möchten Sie möglicherweise nur jemandem etwas zeigen, das Sie getan haben, und den Teil der Installation und Konfiguration eines Webservers überspringen. Mit Diensten wie DigitalOcean oder Linode können Sie in kürzester Zeit einen VPS erstellen ASP.NET Core verfügbar durch dort nur mit .net Core zu installieren.

Wenn Sie jedoch etwas Ernsthafteres wollen (und das wahrscheinlich tun, da Sie hier sind, weil Sie HTTPS aktivieren), sollten Sie einen voll funktionsfähigen Webserver wie Nginx oder IIS (in Windows) als Reverse Proxy für Ihre ASP.NET Kernanwendung.

Ein Reverse-Proxy-Server ist ein Webserver, der Anforderungen akzeptiert und an einen anderen Webserver sendet, der tatsächlich die Antworten für diese Anforderungen erstellt. Die Antworten werden an den Proxyserver zurückgesendet, der sie an die Clients weiterleitet, die die entsprechenden Anforderungen gestellt haben.

Wenn Nginx als Reverse Proxy fungiert, würde es ungefähr so aussehen:

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

Das Gute an diesem Setup ist, dass wir Nginx (oder IIS) als vollständigen Webserver nutzen und HTTPS darauf aktivieren können:

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

Wir müssen Kestrel also nicht einmal mit HTTPS konfigurieren, sondern nur mit Nginx.

HTTPS mit Nginx konfigurieren

Zuerst müssen Sie Nginx installieren. Ich benutze Ubuntu 16.04 dafür, aber Sie können es sogar unter Windows installieren.

Wenn Sie Ubuntu ausführen, öffnen Sie ein Terminal und geben Sie

$ sudo apt-get install nginx

Als nächstes müssen wir die Konfiguration von Nginx bearbeiten. Aber bevor wir das tun, ist es nützlich zu wissen, wo sich die Konfigurationsdateien befinden und wie sie aktiviert werden. Der Ordner, in dem die Konfigurationsdateien normalerweise abgelegt werden, ist /etc/nginx/sites-available/ (dieser Speicherort kann unterschiedlich sein, wenn Sie eine andere Linux-Distribution verwenden).

Die Konfigurationsdatei, die bei der Installation von Nginx vorhanden ist, heißt default.

Damit eine Nginx-Konfiguration aktiviert wird, muss sie sich im Ordner /etc/nginx/sites-enabled befinden. Nach dem Erstellen einer neuen Konfigurationsdatei (in sites-available) wird in sites-enabled ein symbolischer Link erstellt, der auf die neue Datei verweist.

Stellen Sie sich vor, wir hätten gerade eine neue Konfigurationsdatei mit dem Namen my-site-https in sites-available erstellt. Danach würden Sie zum Ordner sites-enabled gehen und den folgenden Befehl ausführen, um einen symbolischen Link zu erstellen:

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

Um Nginx diese neue Konfiguration lesen zu lassen, führen Sie den Befehl aus:

$ sudo nginx -s reload

Nachdem wir nun wissen, wie Nginx-Konfigurationen erstellt und aktiviert werden, erstellen wir die Konfigurationsdatei zum Einrichten von Nginx als Reverse Proxy für eine ASP.NET Kernanwendung, die unter http://localhost:5000 ausgeführt wird.

Erstellen Sie zuerst eine neue Datei in /etc/nginx/sites-available mit dem Namen, z. B. aspnetcore, mit folgendem Inhalt:

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 konfigurieren wir Nginx mit SSL auf listen auf Port 443 (443 ist der Standard für HTTPS). Als nächstes geben wir an, wo sich das Zertifikat (ssl_certificate) und der private Schlüssel (ssl_certificate_key) befinden, und weisen Nginx an, alle Anforderungen (location / entspricht allen Anforderungen) an http://localhost:5000 weiterzuleiten.

Erstellen Sie schließlich den symbolischen Link zu dieser Datei in sites-enabled (Sie können den Link zur default -Datei löschen, dies löscht nicht die Originaldatei, da es sich um einen symbolischen Link handelt).

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

Damit Nginx diese Konfiguration lädt:

$ sudo nginx -s reload

Wenn Sie Ihre ASP.NET Kernanwendung, die unter http://localhost:5000 ausgeführt wird Sie sollten jetzt in der Lage sein, https://localhost zu öffnen und zu sehen, dass es über HTTPS bereitgestellt wird.

Beim erneuten Laden der Nginx-Konfiguration tritt häufig ein Problem auf, bei dem Sie zur Eingabe eines Kennworts aufgefordert werden. Speziell für das Passwort des privaten Schlüssels. Wenn Sie also das Kennwort aus dem privaten Schlüssel entfernen möchten, können Sie den folgenden Befehl ausführen:

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

Eine weitere nützliche Sache, die Sie mit Nginx tun können, ist, dass alle Anfragen an HTTP an HTTPS umgeleitet werden. Wenn Sie dies aktivieren möchten, fügen Sie diese zusätzliche Konfiguration zu Ihrer aspnetcore Nginx-Konfigurationsdatei hinzu:

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

Supervisor konfigurieren

Eine Sache, mit der wir uns befassen müssen, ist, dass wir unsere ASP.NET Core-Web-Anwendung ausgeführt wird.

Es gibt ein Tool namens Supervisor, mit dem wir konfigurieren können, dass eine Anwendung beim Start gestartet werden soll, und wenn sie abstürzt, sollte sie zurückgebracht werden

Als erstes müssen wir sie installieren. Ich benutze Ubuntu 16.04 dafür, und in dieser Distribution ist die Installation sehr einfach:

$ sudo apt-get install supervisor

Als nächstes müssen wir eine Supervisor-Konfigurationsdatei für unsere Webanwendung erstellen. Nennen wir es aspnetcore.conf und fügen Sie es zu /etc/supervisor/conf.d hinzu (Sie müssen dies mit sudo tun):

Platzieren Sie dies in der Konfigurationsdatei:

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"

Die erste Zeile definiert den Namen (aspnetcore), mit dem wir auf die betreffende Webanwendung verweisen können.

Die Zeile mit command definiert den auszuführenden Befehl. In diesem Fall ist es dotnet gefolgt von der DLL Ihrer Webanwendung. Dies entspricht der Ausführung von dotnet run im Stammverzeichnis Ihres Projekts.

Die nächste Zeile (directory=) legt das Arbeitsverzeichnis als dasjenige fest, in dem sich Ihr Projekt befindet.

autostart=true bedeutet, dass die Anwendung beim Start gestartet wird.

autorestart=true bedeutet, dass die Anwendung neu gestartet wird, wenn sie abstürzt oder sogar gestoppt wird (z. B. mit kill). Wenn Sie möchten, dass Ihre Anwendung nur im Falle eines Absturzes neu gestartet wird, ändern Sie sie in autorestart=unexpected .

Die nächsten beiden Zeilen definieren, in welche Dateien die Standard- und die Fehlerausgabe geschrieben werden.

Schließlich environment ermöglicht es uns, Umgebungsvariablen zu setzen, in diesem Fall setzen wir ASPNETCORE_ENVIRONMENT=Production.

Um diese neue Konfigurationsdatei zu aktivieren, führen Sie die folgenden Befehle aus:

$ sudo supervisorctl reread$ sudo supervisorctl update

Sie können den Status der Prozesse überprüfen, die unter Supervisor ausgeführt werden, indem Sie

$ sudo supervisorctl

Es sollte etwas Ähnliches angezeigt werden:

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

Es gibt mehrere Befehle, mit denen Sie die prozesse Geben Sie unter Supervisor help ein, um eine Liste der verfügbaren Befehle anzuzeigen. Zum Beenden geben Sie einfach quit ein.

Konfigurieren von HTTPS mit IIS

Der erste Schritt zum Aktivieren von HTTPS bei Verwendung von IIS besteht darin, unser Zertifikat und unseren privaten Schlüssel zu installieren (mithilfe eines .pfx-Datei, die beide enthält).

Öffnen Sie den IIS-Manager und wählen Sie Serverzertifikate aus

Öffnen Sie Serverzertifikate in IIS

Klicken Sie auf Zertifikat importieren:

 Zertifikat importieren

Wählen Sie die .pfx datei und geben sie das entsprechende passwort, lassen sie den speicher als Persönliche:

 Wählen Sie pfx und geben Sie das Passwort ein

Bevor wir fortfahren, ist es wichtig zu erwähnen, dass Sie die ASP.NET Kernmodul installiert. Es ist sehr wahrscheinlich, dass Sie dies bereits tun, da es bei der Installation des .Net Core SDK für Sie installiert wird.

Falls dies nicht der Fall ist (Sie können dies im IIS-Manager überprüfen, indem Sie Module öffnen und prüfen, ob AspNetCoreModule dort aufgeführt ist), finden Sie hier Installationsanweisungen und einen direkten Link zum Herunterladen der ASP.NET Core Server Hosting Bundle hier.

Dieses Modul startet Ihre ASP.NET Core-Website und halten Sie es laufen (Neustart, wenn es abstürzt). Dieses Modul ist auch für die Weiterleitung der HTTP-Anforderungen an Ihre Web-App und die Weiterleitung der Antworten an den Client verantwortlich.

Eine wichtige Sache, die Sie über das AspNetCoreModule wissen sollten, ist, dass es durch die web.config -Datei im Stammverzeichnis Ihres Projekts konfiguriert wird. Sie müssen dotnet publish in Ihrem Projekt ausführen, um web.config in Ihrem Veröffentlichungsordner ordnungsgemäß einzurichten.

Der nächste Schritt besteht darin, einen neuen Anwendungspool zu erstellen und Keinen verwalteten Code als .NET CLR-Version auszuwählen. Normalerweise werden die Websites in einem IIS-Worker-Prozess ausgeführt, aber in .NET Core werden sie als separater Prozess ausgeführt, sodass keine .Net-Laufzeit im App-Pool erforderlich ist:

Neuen Anwendungspool erstellen

Zum Schluss erstellen wir eine neue Website in IIS für unsere ASP.NET Kernanwendung. Wir müssen den soeben erstellten App-Pool auswählen, als physischen Pfad den Pfad zur veröffentlichten Website auswählen, HTTPS als Bindung und unser Zertifikat in der Dropdown-Liste SSL-Zertifikat auswählen:

 Erstellen Sie eine neue Website

Sie sollten jetzt https verwenden können, um zu Ihrer ASP.NET Kern-App.

Es ist nur fair zu teilen…FacebookTeilen auf Facebook

Facebook

Tweet darüber auf Twitter

Twitter

Teilen auf LinkedIn

Linkedin

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.