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.
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:4430
invece 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 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):
Infine, la modifica delle proprietà del progetto(tasto destro del mouse e selezionare proprietà):
E modificare 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
Fai clic su Importa certificato:
Selezionare il .pfx file e inserire la password corrispondente, lasciare il negozio come personale:
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:
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:
Ora dovresti essere in grado di utilizzare https per ASP.NET App di base.