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.
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 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):
zu testenBearbeiten Sie abschließend die Projekteigenschaften (klicken Sie mit der rechten Maustaste und wählen Sie Eigenschaften):
Und ä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
Klicken Sie auf Zertifikat importieren:
Wählen Sie die .pfx datei und geben sie das entsprechende passwort, lassen sie den speicher als Persönliche:
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:
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:
Sie sollten jetzt https verwenden können, um zu Ihrer ASP.NET Kern-App.