HTTPS in ASP.NET Core from Scratch

Recentemente, quando si esamina come configurare l’autenticazione utilizzando provider di accesso esterni (ad esempio Google, Facebook) con ASP.NET Core Ho notato che https è ora un requisito per alcuni di essi.

Un’altra cosa che ho notato è stata quanto fosse difficile trovare risorse sull’abilitazione di HTTPS ASP.NET Nucleo.

Questo post del blog riguarda il processo di creazione di un ASP locale.Sito Web NET Core in esecuzione con HTTPS senza errori in Chrome (che mostra il lucchetto verde nella barra degli indirizzi) per il tempo di sviluppo locale. E poi come puoi usare Nginx o IIS quando sei pronto ad esporlo al mondo.

 HTTPS ASP.NET CORE

Per poter utilizzare HTTPS abbiamo bisogno di un certificato digitale. Se hai bisogno di generare il tuo da usare in fase di sviluppo, ti consiglio di usare OpenSSL per creare certificati. Non solo spiega come è possibile creare la propria autorità di certificazione e certificati, ma anche come è possibile configurare il browser (Chrome o Firefox) per fidarsi dell’autorità di certificazione.

Inoltre, se vuoi capire qual è il ruolo dei certificati in HTTPS, dai un’occhiata alla breve(ish) spiegazione di come funziona https.

D’ora in poi presumo che tu abbia generato la tua autorità di certificazione, il certificato e la chiave privata corrispondente e tu abbia un .file pfx (Scambio di informazioni personali).

Crea un nuovo progetto

Descriverò il processo usando Visual Studio Code e Yeoman.

Se non si ha familiarità con yeoman, è uno strumento a riga di comando che consente di creare nuovi progetti da un elenco di modelli di progetto. Il generatore yeoman (questo è il nome del pacchetto per yeoman che contiene i modelli) che useremo è generator-aspnet. Per installare yeoman è necessario prima npm e quindi è possibile seguire le istruzioni per l’installazione di yeoman e il ASP.NET Modelli di base qui.

Il motivo per cui si utilizza Visual Studio Code e yeoman è che questo processo funziona su Windows, Linux e macOS.

Per utilizzare yeoman con il ASP.NET Modelli di base eseguire il seguente comando:

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

Selezionare Applicazione Web vuota. Verrà creato un semplice progetto web che ha solo una pagina con il testo “Hello World”.

Se si esegue Windows e si dispone della versione completa di Visual Studio, è sufficiente eseguire File- > Nuovo progetto, selezionare. Net Core, ASP.NET Core Web Application e quindi selezionare Vuoto.

Configurazione di HTTPS per Kestrel

Kestrel è il server web utilizzato per impostazione predefinita con ASP.NET Nucleo.

Per aggiungere il supporto HTTPS a Kestrel aggiungere il pacchetto Microsoft.AspNetCore.Server.Kestrel.Https come dipendenza.

Se si utilizza il progetto.json puoi farlo modificando il progetto.sezione “dipendenze” di json e aggiunta:

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

Il numero di versione potrebbe essere diverso per te, tuttavia dovrebbe essere lo stesso di quello utilizzato nel pacchetto Microsoft.AspNetCore.Server.Kestrel.

Se si utilizza .csproj è possibile aggiungere la dipendenza eseguendo:

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

Configurazione del certificato

Per configurare Kestrel per utilizzare il nostro .file pfx (certificato e chiave privata) dobbiamo modificare Program.cs dove viene creato WebHostBuilder e apportare alcune modifiche:

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

I cambiamenti sono:

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

Che è dove si specifica che cosa è il .file pfx che vogliamo usare e la sua password. UseHttps è un metodo di estensione, se ricevi un errore che dice che non esiste è perché non hai aggiunto il pacchetto nuget Microsoft.AspNetCore.Server.Kestrel.Https, che è dove vive.

Anche:

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

Che definisce dove Kestrel sarà in ascolto per le connessioni in entrata. In alternativa è possibile utilizzare https://localhost:4430invece di *. Con * tuttavia, è possibile utilizzare qualsiasi nome di dominio, ad esempio se si dispone di questa applicazione Web in myDomain.com funzionerebbe ancora, mentre con localhost, verranno servite solo le richieste a localhost.

Nel caso in cui ti stia chiedendo perché non ho usato la porta HTTPS predefinita, 443, è perché hai bisogno di autorizzazioni speciali su Linux per le porte inferiori a 1024. In Windows questo non sarebbe un problema. Tuttavia, poiché fare questo con Kestrel è consigliato solo quando si è in fase di sviluppo, non è un grosso problema.

Se stai provando questo in Linux, macOS o usando la riga di comando in Windows puoi chiamare dotnet run, aprire Chrome e andare su https://localhost:43000 e vedere l’icona di un lucchetto verde.

Se si utilizza full Visual Studio in Windows, è necessario specificare che si desidera eseguire l’applicazione Web direttamente e non tramite IIS Express:

Seleziona l'applicazione nelle opzioni esegui

Seleziona anche il browser su cui vuoi provarlo. Se avete installato il vostro radice di prova certificato dell’autorità di certificazione in un browser specifico, utilizzare il browser, per esempio Chrome (se siete confusi da questa affermazione mi consiglia di leggere il Breve(ish) spiegazione di come funziona https e Usando OpenSSL per Creare i Certificati):

Selezionare Chrome come browser per provare l'applicazione in

Infine, la modifica delle proprietà del progetto(tasto destro del mouse e selezionare proprietà):

fare clic Destro e selezionare proprietà

E modificare l’url di avvio:

Modifica l'URL di avvio

Utilizzando ASP.NET Core con un proxy inverso

Anche se è certamente possibile servire un’applicazione web utilizzando ASP.NET Core utilizzando solo gheppio, non è raccomandato. Questo perché Kestrel non è un server web completamente descritto ed è ancora privo di alcune caratteristiche di sicurezza.

Anche se non è raccomandato, potresti semplicemente voler mostrare qualcosa che hai fatto a qualcuno e saltare la parte di installazione e configurazione di un server Web. Con servizi come DigitalOcean o Linode puoi creare un VPS in pochissimo tempo e avere il tuo ASP.NET Core disponibile attraverso solo dover installare. net core.

Tuttavia, se vuoi qualcosa di più serio (e probabilmente lo fai dato che sei qui a causa dell’abilitazione di HTTPS) dovresti usare un server Web completo, come Nginx o IIS( in Windows), come proxy inverso per il tuo ASP.NET Applicazione di base.

Un server proxy inverso è un server Web che accetta le richieste e le invia a un altro server Web che crea effettivamente le risposte per tali richieste. Le risposte vengono inviate al server proxy che le inoltra ai client che hanno emesso le richieste corrispondenti.

Con Nginx che agisce come un proxy inverso sarebbe simile a questo:

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

La cosa buona di questa configurazione è che possiamo sfruttare Nginx (o IIS) come server Web completo e abilitare HTTPS su di esso:

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

Quindi non abbiamo nemmeno bisogno di configurare Kestrel con HTTPS, solo Nginx.

Configurazione di HTTPS con Nginx

Per prima cosa devi installare Nginx. Sto usando Ubuntu 16.04 per questo, tuttavia puoi anche installarlo su Windows.

Se si esegue Ubuntu aprire un terminale e digitare

$ sudo apt-get install nginx

La prossima cosa che dobbiamo fare è modificare la configurazione di Nginx. Ma prima di farlo è utile sapere qual è la posizione dei file di configurazione e come vengono abilitati. La cartella in cui vengono solitamente posizionati i file di configurazione è /etc/nginx/sites-available/ (questa posizione potrebbe essere diversa se si utilizza una distribuzione Linux diversa).

Il file di configurazione presente quando si installa Nginx è denominato default.

Affinché una configurazione Nginx venga abilitata, deve trovarsi nella cartella /etc/nginx/sites-enabled. Quindi dopo aver creato un nuovo file di configurazione (in sites-available) viene creato un collegamento simbolico in sites-enabled che punta al nuovo file.

Immagina di aver appena creato un nuovo file di configurazione chiamato my-site-https in sites-available. Dopodiché andrai nella cartella sites-enabled ed esegui il seguente comando per creare un collegamento simbolico:

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

Per fare in modo che Nginx legga questa nuova configurazione esegui il comando:

$ sudo nginx -s reload

Ora che sappiamo come creare e abilitare le configurazioni Nginx creiamo il file di configurazione per configurare Nginx come proxy inverso a un ASP.NET Applicazione di base che è in esecuzione a http://localhost:5000.

Creare prima un nuovo file in /etc/nginx/sites-available denominato, ad esempio, aspnetcore , con i seguenti contenuti:

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; }}

Qui stiamo configurando Nginx su listen alla porta 443 usando SSL (443 è l’impostazione predefinita per HTTPS). Successivamente stiamo specificando dove si trovano il certificato (ssl_certificate) e la chiave privata (ssl_certificate_key) e infine stiamo istruendo Nginx a inoltrare tutte le richieste (location / corrisponderà a tutte le richieste) a http://localhost:5000.

Infine, crea il collegamento simbolico a questo file in sites-enabled (puoi eliminare il collegamento al file default, questo non eliminerà il file originale poiché è un collegamento simbolico).

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

Per fare in modo che Nginx carichi questa configurazione:

$ sudo nginx -s reload

Se hai il tuo ASP.NET Applicazione principale in esecuzione su http://localhost:5000 ora dovresti essere in grado di aprire https://localhost e vederlo servito su HTTPS.

C’è un problema comune che potrebbe verificarsi quando si ricarica la configurazione Nginx, che viene richiesta una password. Specificamente per la password della chiave privata. Questo potrebbe non essere pratico per te, quindi se vuoi rimuovere la password dalla chiave privata puoi eseguire il seguente comando:

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

Un’altra cosa utile che puoi fare con Nginx è che tutte le richieste a HTTP vengano reindirizzate a HTTPS. Se vuoi abilitare questo aggiungi questa configurazione extra aspnetcore File di configurazione Nginx:

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

Configurazione Supervisore

Una cosa che dobbiamo preoccuparci è che abbiamo bisogno di mantenere il nostro ASP.NET Applicazione web di base in esecuzione.

C’è uno strumento chiamato supervisor che ci consente di configurare che un’applicazione debba essere avviata all’avvio e, se si blocca, dovrebbe essere ripristinata

La prima cosa che dobbiamo fare è installarla. Sto usando Ubuntu 16.04 per questo, e in questa distribuzione installarlo è molto semplice:

$ sudo apt-get install supervisor

La prossima cosa che dobbiamo fare è creare un file di configurazione del supervisore per la nostra applicazione web. Chiamiamolo aspnetcore.conf e aggiungiamolo a /etc/supervisor/conf.d(devi farlo usando sudo):

Posiziona questo all’interno del file di configurazione:

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"

La prima riga definisce il nome (aspnetcore) con cui possiamo fare riferimento all’applicazione web in supervisor.

La riga con command definisce il comando da eseguire. In questo caso è dotnet seguito dalla dll dell’applicazione web. Questo equivale a eseguire dotnet run nella radice del progetto.

La riga successiva (directory=) imposta la directory di lavoro come quella in cui si trova il progetto.

autostart=true significa che l’applicazione verrà avviata all’avvio.

autorestart=true significa che l’applicazione verrà riavviata se si blocca o anche se viene arrestata (ad esempio utilizzando kill). Se si desidera che l’applicazione venga riavviata solo in caso di arresto anomalo, modificarla in autorestart=unexpected.

Le due righe successive definiscono a quali file vengono scritti rispettivamente lo standard e l’output di errore.

Infine environment ci permette di impostare variabili di ambiente, in questo caso stiamo impostando ASPNETCORE_ENVIRONMENT=Production.

Per abilitare questo nuovo file di configurazione eseguire i seguenti comandi:

$ sudo supervisorctl reread$ sudo supervisorctl update

È possibile controllare lo stato dei processi in esecuzione sotto supervisore eseguendo

$ sudo supervisorctl

dovrebbe apparire qualcosa di simile a:

aspnetcore ESECUZIONE pid 18817, durata 0:05:29
supervisore>

non Ci sono più alcuni comandi che è possibile utilizzare per gestire i processi di supervisore, tipo help per un elenco dei comandi disponibili. Per uscire, basta digitare quit.

Configurazione di HTTPS con IIS

Il primo passo per abilitare HTTPS durante l’utilizzo di IIS è installare il nostro certificato e la chiave privata (utilizzando a .file pfx che contiene entrambi).

Apri IIS Manager e seleziona Certificati server

 Apri certificati server in IIS

Fai clic su Importa certificato:

Importa certificato

Selezionare il .pfx file e inserire la password corrispondente, lasciare il negozio come personale:

Selezionare pfx e inserire la password

Prima di continuare è importante ricordare che è necessario avere il ASP.NET Modulo di base installato. È molto probabile che tu lo faccia già poiché è installato per te quando installi. Net Core SDK.

Tuttavia, nel caso in cui non lo sia (è possibile verificarlo in IIS Manager aprendo i moduli e verificare se AspNetCoreModule è elencato lì), è possibile trovare le istruzioni di installazione qui e un link diretto per il download del ASP.NET Core Server Hosting Bundle qui.

Ciò che questo modulo fa è avviare il tuo ASP.NET Sito web principale e tenerlo in esecuzione (riavviandolo se si blocca). Questo modulo è anche responsabile dell’inoltro delle richieste HTTP all’app Web e quindi dell’inoltro delle risposte al client.

Una cosa importante da sapere su AspNetCoreModule è che è configurato dal file web.config nella radice del progetto. È necessario eseguire dotnet publish sul progetto per ottenere la configurazione web.config correttamente nella cartella di pubblicazione.

Il passo successivo consiste nel creare un nuovo pool di applicazioni e selezionare Nessun codice gestito come versione CLR.NET. Normalmente i siti Web vengono eseguiti all’interno di un processo di lavoro IIS, ma in. NET Core vengono eseguiti come processo separato, quindi non è necessario un runtime. Net nel pool di app:

Crea nuovo pool di applicazioni

Infine, creiamo un nuovo sito web all’interno di IIS per il nostro ASP.NET Applicazione di base. Dobbiamo selezionare il pool di app che abbiamo appena creato, selezionare come percorso fisico il percorso del sito Web pubblicato, selezionare HTTPS come associazione e il nostro certificato nel menu a discesa Certificato SSL:

Crea un nuovo sito web

Ora dovresti essere in grado di utilizzare https per ASP.NET App di base.

È giusto condividere… Condividi su Facebook

Facebook

 Tweet su Twitter

Twitter

 Condividi su LinkedIn

Linkedin

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.