Condividi tramite


Imporre HTTPS in ASP.NET Core

Di David Galvan e Rick Anderson

questo articolo illustra come:

  • Richiedi HTTPS per tutte le richieste.
  • Reindirizzare tutte le richieste HTTP a HTTPS.

Nessuna API può impedire a un client di inviare dati sensibili alla prima richiesta.

Avviso

Progetti API

Non utilizzareRequireHttpsAttribute nelle API Web che ricevono informazioni riservate. RequireHttpsAttribute usa i codici di stato HTTP per reindirizzare i browser da HTTP a HTTPS. I client API potrebbero non comprendere o obbedire ai reindirizzamenti da HTTP a HTTPS. Tali client possono inviare informazioni su HTTP. Le API Web devono:

  • Non ascoltare su HTTP.
  • Chiudere la connessione con il codice di stato 400 (Richiesta non valida) e non gestire la richiesta.

Per disabilitare il reindirizzamento HTTP in un'API, impostare la ASPNETCORE_URLS variabile di ambiente o usare il flag della --urls riga di comando. Per altre informazioni, vedere Usare più ambienti in ASP.NET Core e 8 modi per impostare gli URL per un'app ASP.NET Core di Andrew Lock.

Progetti HSTS e API

I progetti API predefiniti non includono HSTS perché HSTS è in genere un'istruzione solo browser. Altri chiamanti, ad esempio le app per telefono o desktop, non obbediscono all'istruzione. Anche all'interno dei browser, una singola chiamata autenticata a un'API tramite HTTP presenta rischi per le reti non sicure. L'approccio sicuro consiste nel configurare i progetti API in modo che ascoltino e rispondano solo tramite HTTPS.

Il reindirizzamento HTTP a HTTPS causa ERR_INVALID_REDIRECT nella richiesta preliminare CORS

Richieste a un endpoint che usano HTTP e che vengono reindirizzate a HTTPS UseHttpsRedirection falliscono con ERR_INVALID_REDIRECT sulla richiesta preliminare CORS.

I progetti API possono rifiutare le richieste HTTP anziché usarle UseHttpsRedirection per reindirizzare le richieste a HTTPS.

Richiedere HTTPS

Consigliamo di usare app Web ASP.NET Core in ambienti di produzione:

  • Middleware di reindirizzamento HTTPS (UseHttpsRedirection) per reindirizzare le richieste HTTP a HTTPS.
  • Middleware di HSTS (UseHsts) per l'invio delle intestazioni del protocollo di sicurezza HTTP Strict Transport Security (HSTS) ai client.

Nota

Le app distribuite in una configurazione del proxy inverso consentono al proxy di gestire la sicurezza delle connessioni (HTTPS). Se il proxy gestisce anche il reindirizzamento HTTPS, non è necessario usare il middleware di reindirizzamento HTTPS. Se il server proxy gestisce anche la scrittura di intestazioni HSTS (ad esempio, il supporto HSTS nativo in IIS 10.0 (1709) o versione successiva, il middleware HSTS non è richiesto dall'app. Per altre informazioni, vedere Escludere HTTPS/HSTS durante la creazione del progetto.

UseHttpsRedirection

Il codice seguente chiama UseHttpsRedirection nel file Program.cs.

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();

var app = builder.Build();

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();

Il codice evidenziato precedente:

È consigliabile usare reindirizzamenti temporanei anziché reindirizzamenti permanenti. La memorizzazione nella cache dei collegamenti può causare un comportamento instabile negli ambienti di sviluppo. Se si preferisce inviare un codice di stato di reindirizzamento permanente quando l'app si trova in un ambiente non di sviluppo, vedere la sezione Configurare reindirizzamenti permanenti nell'ambiente di produzione . È consigliabile usare HSTS per segnalare ai client che devono essere inviate solo richieste di risorse sicure all'app (solo in produzione).

Configurazione della porta

Una porta deve essere disponibile per il middleware per reindirizzare una richiesta non sicura a HTTPS. Se non è disponibile alcuna porta:

  • Il reindirizzamento a HTTPS non si verifica.
  • Il middleware registra l'avviso "Impossibile determinare la porta https per il reindirizzamento".

Specificare la porta HTTPS usando uno degli approcci seguenti:

  • Impostare HttpsRedirectionOptions.HttpsPort.

  • Impostare le impostazioni dell'host https_port.

    • Nella configurazione host.

    • Impostando la ASPNETCORE_HTTPS_PORT variabile di ambiente.

    • Aggiungendo una voce di primo livello in appsettings.json:

      {
        "https_port": 443,
        "Logging": {
          "LogLevel": {
            "Default": "Information",
            "Microsoft.AspNetCore": "Warning"
          }
        },
        "AllowedHosts": "*"
      }
      
  • Indicare una porta con lo schema sicuro usando la variabile di ambiente ASPNETCORE_URLS. La variabile di ambiente configura il server. Il middleware individua indirettamente la porta HTTPS tramite IServerAddressesFeature. Questo approccio non funziona nelle implementazioni di proxy inversi.

  • I modelli web ASP.NET Core configurano un URL HTTPS in Properties/launchsettings.json sia per Kestrel che per IIS Express. launchsettings.json viene usato solo nel computer locale.

  • Configurare un endpoint URL HTTPS per una distribuzione perimetrale pubblica del Kestrel server o HTTP.sys server. L'app usa una sola porta HTTPS. Il middleware individua la porta tramite IServerAddressesFeature.

Nota

Quando un'app viene eseguita in una configurazione del proxy inverso, IServerAddressesFeature non è disponibile. Impostare la porta usando uno degli altri approcci descritti in questa sezione.

Implementazioni Edge

Quando Kestrel o HTTP.sys viene utilizzato come server perimetrale pubblico, Kestrel o HTTP.sys deve essere configurato per l'ascolto su entrambe le porte richieste.

  • Porta sicura in cui viene reindirizzato il client (in genere, 443 nell'ambiente di produzione e 5001 in fase di sviluppo).
  • Porta non sicura (in genere 80 in produzione e 5000 in fase di sviluppo).

La porta non sicura deve essere accessibile dal client per consentire all'app di ricevere una richiesta non sicura e reindirizzare il client alla porta protetta.

Per ulteriori informazioni, vedere la configurazione dell'endpoint o l'implementazione del sistema server Web HTTP.sys in ASP.NET Core.

Scenari di distribuzione

Qualsiasi firewall tra il client e il server deve anche avere porte di comunicazione aperte per il traffico.

Se le richieste sono inoltrate in una configurazione di proxy inverso, utilizzare Forwarded Headers Middleware prima di chiamare il middleware di reindirizzamento HTTPS. Il Middleware delle Intestazioni Inoltrate aggiorna Request.Scheme usando l'intestazione X-Forwarded-Proto. Il middleware consente il corretto funzionamento degli URI di reindirizzamento e di altri criteri di sicurezza. Quando il middleware delle intestazioni inoltrate non viene usato, l'applicazione back-end potrebbe non ricevere lo schema corretto e finire in un loop di reindirizzamento. Un messaggio di errore comune dell'utente finale è che si sono verificati troppi reindirizzamenti.

Quando si esegue la distribuzione nel servizio app Azure, seguire le indicazioni riportate in Esercitazione: Associare un certificato SSL personalizzato esistente ad Azure App Web.

Opzioni

Il seguente codice evidenziato chiama AddHttpsRedirection per configurare le opzioni del middleware.

using static Microsoft.AspNetCore.Http.StatusCodes;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();

builder.Services.AddHsts(options =>
{
    options.Preload = true;
    options.IncludeSubDomains = true;
    options.MaxAge = TimeSpan.FromDays(60);
    options.ExcludedHosts.Add("example.com");
    options.ExcludedHosts.Add("www.example.com");
});

builder.Services.AddHttpsRedirection(options =>
{
    options.RedirectStatusCode = Status307TemporaryRedirect;
    options.HttpsPort = 5001;
});

var app = builder.Build();

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();

La chiamata AddHttpsRedirection è necessaria solo per modificare i valori di HttpsPort o RedirectStatusCode.

Il codice evidenziato precedente:

Configurare reindirizzamenti permanenti nell'ambiente di produzione

Il middleware usa per impostazione predefinita l'invio di un oggetto Status307TemporaryRedirect con tutti i reindirizzamenti. Se si preferisce inviare un codice di stato di reindirizzamento permanente quando l'app si trova in un ambiente non di sviluppo, avvolgere la configurazione delle opzioni del middleware in un controllo condizionale per un ambiente diverso dallo sviluppo.

Quando si configurano i servizi in Program.cs:

using static Microsoft.AspNetCore.Http.StatusCodes;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();

if (!builder.Environment.IsDevelopment())
{
    builder.Services.AddHttpsRedirection(options =>
    {
        options.RedirectStatusCode = Status308PermanentRedirect;
        options.HttpsPort = 443;
    });
}

var app = builder.Build();

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");

    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();

Approccio alternativo al middleware di reindirizzamento HTTPS

Un'alternativa all'uso del middleware di reindirizzamento HTTPS (UseHttpsRedirection) consiste nell'usare il middleware di riscrittura URL (AddRedirectToHttps). AddRedirectToHttps può anche impostare il codice di stato e la porta quando viene eseguito il reindirizzamento. Per ulteriori informazioni, vedere Middleware di riscrittura degli URL.

Quando si reindirizza a HTTPS senza il requisito di regole di reindirizzamento aggiuntive, è consigliabile usare il middleware di reindirizzamento HTTPS (UseHttpsRedirection) descritto in questo articolo.

HTTP Strict Transport Security Protocol (HSTS)

Per OWASP, HTTP Strict Transport Security (HSTS) è un miglioramento della sicurezza di consenso esplicito specificato da un'app Web tramite l'uso di un'intestazione di risposta. Quando un browser che supporta HSTS riceve l'intestazione HTTP:

  • Il browser archivia la configurazione per il dominio che impedisce l'invio di comunicazioni tramite HTTP. Il browser forza tutte le comunicazioni tramite HTTPS.
  • Il browser impedisce all'utente di usare certificati non attendibili o non validi. Il browser disabilita le richieste che consentono a un utente di considerare temporaneamente attendibile tale certificato.

Poiché HSTS viene applicato dal client, presenta alcune limitazioni:

  • Il client deve supportare HSTS.
  • HSTS richiede almeno una richiesta HTTPS riuscita per stabilire i criteri HSTS.
  • L'applicazione deve controllare ogni richiesta HTTP e reindirizzare o rifiutare la richiesta HTTP.

ASP.NET Core implementa HSTS con il UseHsts metodo di estensione. Il codice seguente chiama UseHsts quando l'app non è in modalità di sviluppo:

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();

var app = builder.Build();

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();

UseHsts non è consigliato in fase di sviluppo perché le impostazioni HSTS sono altamente memorizzabili nella cache dai browser. Per impostazione predefinita, UseHsts esclude l'indirizzo di loopback locale.

Per gli ambienti di produzione che implementano HTTPS per la prima volta, impostare il valore iniziale HstsOptions.MaxAge su un valore ridotto usando uno dei metodi TimeSpan. Impostare il valore da ore a non più di un singolo giorno nel caso in cui sia necessario ripristinare l'infrastruttura HTTPS su HTTP. Dopo aver fiducia nella sostenibilità della configurazione HTTPS, aumentare il valore HSTS max-age ; un valore comunemente usato è un anno.

Il codice evidenziato seguente:

using static Microsoft.AspNetCore.Http.StatusCodes;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();

builder.Services.AddHsts(options =>
{
    options.Preload = true;
    options.IncludeSubDomains = true;
    options.MaxAge = TimeSpan.FromDays(60);
    options.ExcludedHosts.Add("example.com");
    options.ExcludedHosts.Add("www.example.com");
});

builder.Services.AddHttpsRedirection(options =>
{
    options.RedirectStatusCode = Status307TemporaryRedirect;
    options.HttpsPort = 5001;
});

var app = builder.Build();

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();
  • Imposta il parametro di precaricamento dell'intestazione Strict-Transport-Security . Il precaricamento non fa parte della specifica RFC HSTS, ma è supportato dai browser web per precaricare i siti HSTS in seguito a una nuova installazione. Per ulteriori informazioni, vedere https://hstspreload.org/.
  • Abilita includeSubDomain, che applica il criterio HSTS ai sottodomini host.
  • Imposta in modo esplicito il max-age parametro dell'intestazione Strict-Transport-Security su 60 giorni. Se non è impostato, il valore predefinito è 30 giorni. Per ulteriori informazioni, vedere la direttiva max-age.
  • Aggiunge example.com all'elenco di host da escludere.

UseHsts esclude gli host di loopback seguenti:

  • localhost : l'indirizzo di loopback IPv4.
  • 127.0.0.1 : indirizzo di loopback IPv4.
  • [::1] : L'indirizzo di loopback IPv6.

Rifiutare esplicitamente HTTPS/HSTS alla creazione del progetto

In alcuni scenari di servizio back-end in cui la sicurezza della connessione viene gestita nel perimetro pubblico della rete, la configurazione della sicurezza delle connessioni in ogni nodo non è necessaria. Le app Web generate dai modelli in Visual Studio o dal comando dotnet new abilitano il reindirizzamento HTTPS e HSTS. Per le distribuzioni che non richiedono questi scenari, è possibile rifiutare esplicitamente HTTPS/HSTS quando l'app viene creata dal modello.

Per rifiutare esplicitamente HTTPS/HSTS:

Deseleziona la checkbox Configura per HTTPS.

Nuova finestra di dialogo ASP.NET Core Web Application con la casella di controllo Configura per HTTPS deselezionata.

Considerare attendibile il certificato di sviluppo HTTPS ASP.NET Core

.NET Core SDK include un certificato di sviluppo HTTPS. Il certificato viene installato come parte dell'esperienza di prima esecuzione. Ad esempio, dotnet --info produce una variante dell'output seguente:

ASP.NET Core
------------
Successfully installed the ASP.NET Core HTTPS Development Certificate.
To trust the certificate run 'dotnet dev-certs https --trust' (Windows and macOS only).
For establishing trust on other platforms refer to the platform specific documentation.
For more information on configuring HTTPS see https://go.microsoft.com/fwlink/?linkid=848054.

L'installazione di .NET Core SDK include l'installazione del certificato di sviluppo HTTPS ASP.NET Core nell'archivio certificati utente locale. Il certificato è stato installato, ma non è attendibile. Per considerare attendibile il certificato, eseguire il passaggio una tantum per eseguire lo strumento dotnet dev-certs.

dotnet dev-certs https --trust

Il comando seguente fornisce aiuto sullo strumento dotnet dev-certs:

dotnet dev-certs https --help

Avviso

Non creare un certificato di sviluppo in un ambiente che verrà ridistribuito, ad esempio un'immagine del contenitore o una macchina virtuale. Questo può portare allo spoofing e all'elevazione dei privilegi. Per evitare questo problema, impostare la DOTNET_GENERATE_ASPNET_CERTIFICATE variabile di ambiente su false prima di chiamare l'interfaccia della riga di comando di .NET per la prima volta. Questa operazione ignora la generazione automatica del certificato di sviluppo ASP.NET Core durante la prima esecuzione dell'interfaccia della riga di comando.

Come configurare un certificato per sviluppatore per Docker

Vedere il problema in GitHub.

Considerazioni specifiche di Linux

Le distribuzioni linux differiscono in modo sostanziale nel modo in cui contrassegnano i certificati come attendibili. Sebbene dotnet dev-certs sia ampiamente applicabile, è ufficialmente supportato solo in Ubuntu e Fedora e mira in particolare a garantire la fiducia nei browser basati su Firefox e Chromium (Edge, Chrome e Chromium).

Dipendenze

Per stabilire la fiducia di OpenSSL, lo strumento openssl deve trovarsi nel path di sistema.

Per stabilire l'attendibilità del browser (ad esempio, in Edge o Firefox), lo certutil strumento deve trovarsi nel percorso.

Fiducia OpenSSL

Quando il certificato di sviluppo ASP.NET Core è attendibile, viene esportato in una cartella nella home directory dell'utente corrente. Per fare in modo che OpenSSL (e i client che lo usano) rilevino questa cartella, è necessario impostare la SSL_CERT_DIR variabile di ambiente. È possibile eseguire questa operazione in una singola sessione eseguendo un comando come export SSL_CERT_DIR=$HOME/.aspnet/dev-certs/trust:/usr/lib/ssl/certs (il valore esatto sarà nell'output quando --verbose viene passato) o aggiungendolo al file di configurazione specifico della tua distribuzione e shell (ad esempio .profile).

Questo è necessario per far sì che strumenti come curl considerino attendibile il certificato di sviluppo. In alternativa, è possibile passare -CAfile o -CApath a ogni singola curl chiamata.

Si noti che questo richiede la versione 1.1.1h o successiva oppure la 3.0.0 o successiva, a seconda della versione principale che stai usando.

Se l'attendibilità di OpenSSL entra in uno stato non valido (ad esempio, se dotnet dev-certs https --clean non riesce a rimuoverlo), spesso si possono correggere la situazione usando lo strumento c_rehash.

Sostituzioni

Se si usa un altro browser con un archivio NSS (Network Security Services), è possibile usare la DOTNET_DEV_CERTS_NSSDB_PATHS variabile di ambiente per specificare un elenco delimitato da due punti delle directory NSS (ad esempio, la directory contenente cert9.db) a cui aggiungere il certificato di sviluppo.

Se si archiviano i certificati che si desidera che OpenSSL consideri attendibile in una directory specifica, è possibile usare la DOTNET_DEV_CERTS_OPENSSL_CERTIFICATE_DIRECTORY variabile di ambiente per indicare dove si trova.

Avviso

Se si imposta una di queste variabili, è importante che vengano impostate sullo stesso valore ogni volta che viene aggiornata l'attendibilità. Se le posizioni cambiano, lo strumento non sarà in grado di riconoscere i certificati nelle vecchie posizioni, ad esempio, per ripulirli.

Uso di sudo

Come in altre piattaforme, i certificati di sviluppo vengono archiviati e considerati attendibili separatamente per ogni utente. Di conseguenza, se si esegue dotnet dev-certs come utente diverso (ad esempio usando sudo), è quell'utente (ad esempio root) che si fiderà del certificato di sviluppo.

Rendere attendibile il certificato HTTPS su Linux con linux-dev-certs

linux-dev-certs è uno strumento globale .NET open source supportato dalla community che offre un modo pratico per creare e considerare attendibile un certificato per sviluppatori in Linux. Lo strumento non è gestito o supportato da Microsoft.

I comandi seguenti installano lo strumento e creano un certificato per sviluppatori attendibile:

dotnet tool update -g linux-dev-certs
dotnet linux-dev-certs install

Per ulteriori informazioni o per segnalare problemi, consulta il repository GitHub linux-dev-certs.

Risolvi i problemi relativi ai certificati, ad esempio il certificato non attendibile

Questa sezione fornisce informazioni utili quando il certificato di sviluppo HTTPS core ASP.NET è stato installato e attendibile, ma sono ancora presenti avvisi del browser che il certificato non è attendibile. Il certificato di sviluppo HTTPS core ASP.NET viene usato da Kestrel.

Per ripristinare il certificato IIS Express, vedere questo problema di Stackoverflow .

Tutte le piattaforme : certificato non attendibile

Eseguire i comandi seguenti:

dotnet dev-certs https --clean
dotnet dev-certs https --trust

Chiudere tutte le istanze del browser aperte. Aprire una nuova finestra del browser per l'app. L'attendibilità del certificato viene memorizzata nella cache dai browser.

dotnet dev-certs https --clean non riesce

I comandi precedenti risolveranno la maggior parte dei problemi di attendibilità del browser. Se il browser non considera attendibile il certificato, seguire i suggerimenti specifici della piattaforma che seguono.

Docker : certificato non attendibile

  • Eliminare la cartella C:\Users{USER}\AppData\Roaming\ASP.NET\Https .
  • Pulire la soluzione. Eliminare le cartelle bin e obj.
  • Riavviare lo strumento di sviluppo. Ad esempio, Visual Studio o Visual Studio Code.

Windows - Certificato non attendibile

  • Controllare i certificati nell'archivio certificati. Deve essere presente un localhost certificato con il ASP.NET Core HTTPS development certificate nome descrittivo sia sotto Current User > Personal > Certificates che sotto Current User > Trusted root certification authorities > Certificates
  • Rimuovere tutti i certificati trovati sia dalle autorità di certificazione personali sia da quelle di radice attendibili. Non rimuovere il certificato localhost di IIS Express.
  • Eseguire i comandi seguenti:
dotnet dev-certs https --clean
dotnet dev-certs https --trust

Chiudere tutte le istanze del browser aperte. Aprire una nuova finestra del browser per l'app.

OS X - Certificato non attendibile

  • Apri Accesso Portachiavi.
  • Selezionare il portachiavi di sistema.
  • Verificare la presenza di un certificato localhost.
  • Verificare che contenga un + simbolo sull'icona per indicare che è attendibile per tutti gli utenti.
  • Rimuovere il certificato dal portachiavi di sistema.
  • Eseguire i comandi seguenti:
dotnet dev-certs https --clean
dotnet dev-certs https --trust

Chiudere tutte le istanze del browser aperte. Aprire una nuova finestra del browser per l'app.

Per la risoluzione dei problemi relativi ai certificati con Visual Studio, vedere Errore HTTPS con IIS Express (dotnet/AspNetCore #16892 ).

Certificato Linux non attendibile

Verificare che il certificato configurato per l'attendibilità sia il certificato per sviluppatore HTTPS utente che verrà usato dal Kestrel server.

Controllare il certificato per sviluppatore Kestrel HTTPS predefinito dell'utente corrente nel percorso seguente:

ls -la ~/.dotnet/corefx/cryptography/x509stores/my

Il file del certificato di sviluppatore Kestrel HTTPS è l'impronta digitale SHA1. Quando il file viene eliminato tramite dotnet dev-certs https --clean, viene rigenerato quando necessario con un'impronta digitale diversa. Verificare che l'impronta digitale del certificato esportato corrisponda a quanto ottenuto con il comando seguente.

openssl x509 -noout -fingerprint -sha1 -inform pem -in /usr/local/share/ca-certificates/aspnet/https.crt

Se il certificato non corrisponde, potrebbe essere uno dei seguenti:

  • Un certificato precedente.
  • Un certificato sviluppatore è stato esportato per l'utente root. In questo caso, esportare il certificato.

Il certificato root utente può essere controllato all'indirizzo:

ls -la /root/.dotnet/corefx/cryptography/x509stores/my

Certificato SSL di IIS Express usato con Visual Studio

Per risolvere i problemi relativi al certificato IIS Express, selezionare Ripristina dal programma di installazione di Visual Studio. Per altre informazioni, vedere questo problema in GitHub.

Criteri di gruppo impediscono l'attendibilità dei certificati autofirmati

In alcuni casi, i criteri di gruppo potrebbero impedire l'attendibilità dei certificati autofirmati. Per altre informazioni, vedere questo problema in GitHub.

Informazioni aggiuntive

Nota

Se si usa .NET 9 SDK o versione successiva, vedere le procedure linux aggiornate nella versione .NET 9 di questo articolo.

Avviso

Progetti API

Non usare RequireHttpsAttribute sulle API Web che ricevono informazioni riservate. RequireHttpsAttribute usa i codici di stato HTTP per reindirizzare i browser da HTTP a HTTPS. I client API potrebbero non comprendere o obbedire ai reindirizzamenti da HTTP a HTTPS. Tali client possono inviare informazioni su HTTP. Le API Web devono:

  • Non è in ascolto su HTTP.
  • Chiudere la connessione con il codice di stato 400 (Richiesta non valida) e non gestire la richiesta.

Per disabilitare il reindirizzamento HTTP in un'API, impostare la ASPNETCORE_URLS variabile di ambiente o usare il flag della --urls riga di comando. Per altre informazioni, vedere Usare più ambienti in ASP.NET Core e 8 modi per impostare gli URL per un'app ASP.NET Core di Andrew Lock.

Progetti HSTS e API

I progetti API predefiniti non includono HSTS perché HSTS è in genere un'istruzione solo browser. Altri chiamanti, ad esempio le app per telefono o desktop, non obbediscono all'istruzione. Anche all'interno dei browser, una singola chiamata autenticata a un'API tramite HTTP presenta rischi per le reti non sicure. L'approccio sicuro consiste nel configurare i progetti API in modo che ascoltino e rispondano solo tramite HTTPS.

Il reindirizzamento da HTTP a HTTPS causa ERR_INVALID_REDIRECT sulla richiesta CORS preliminare.

Le richieste a un endpoint che utilizzano HTTP e vengono reindirizzate a HTTPS da UseHttpsRedirection falliscono con ERR_INVALID_REDIRECT nella richiesta preliminare CORS.

I progetti API possono rifiutare le richieste HTTP anziché usarle UseHttpsRedirection per reindirizzare le richieste a HTTPS.

Richiedere HTTPS

Si consiglia di utilizzare applicazioni web ASP.NET Core in produzione:

  • Middleware di reindirizzamento HTTPS (UseHttpsRedirection) per reindirizzare le richieste HTTP a HTTPS.
  • Middleware HSTS (UseHsts) per inviare intestazioni del Protocollo di Sicurezza Rigida del Trasporto HTTP (HSTS) ai client.

Nota

Le app distribuite in una configurazione del proxy inverso consentono al proxy di gestire la sicurezza delle connessioni (HTTPS). Se il proxy gestisce anche il reindirizzamento HTTPS, non è necessario usare il middleware di reindirizzamento HTTPS. Se il server proxy gestisce anche la scrittura di intestazioni HSTS (ad esempio, il supporto HSTS nativo in IIS 10.0 (1709) o versione successiva, il middleware HSTS non è richiesto dall'app. Per ulteriori informazioni, vedere Rinunciare a HTTPS/HSTS durante la creazione del progetto.

UseHttpsRedirection

Viene chiamato il seguente codice UseHttpsRedirection nel file Program.cs.

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();

var app = builder.Build();

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();

Il codice evidenziato precedente:

È consigliabile usare reindirizzamenti temporanei anziché reindirizzamenti permanenti. La memorizzazione nella cache dei collegamenti può causare un comportamento instabile negli ambienti di sviluppo. Se si preferisce inviare un codice di stato di reindirizzamento permanente quando l'app si trova in un ambiente non di sviluppo, vedere la sezione Configurare reindirizzamenti permanenti nell'ambiente di produzione . È consigliabile usare HSTS per segnalare ai client che devono essere inviate solo richieste di risorse sicure all'app (solo in produzione).

Configurazione della porta

Una porta deve essere disponibile per il middleware per reindirizzare una richiesta non sicura a HTTPS. Se non è disponibile alcuna porta:

  • Il reindirizzamento a HTTPS non si verifica.
  • Il middleware registra l'avviso "Impossibile determinare la porta https per il reindirizzamento".

Specificare la porta HTTPS usando uno degli approcci seguenti:

  • Imposta HttpsRedirectionOptions.HttpsPort.

  • Configurare l'impostazione https_porthost:

    • Nella configurazione host.

    • Impostando la ASPNETCORE_HTTPS_PORT variabile di ambiente.

    • Aggiungendo una voce di primo livello in appsettings.json:

      {
        "https_port": 443,
        "Logging": {
          "LogLevel": {
            "Default": "Information",
            "Microsoft.AspNetCore": "Warning"
          }
        },
        "AllowedHosts": "*"
      }
      
  • Indicare una porta con lo schema sicuro usando la variabile di ambiente ASPNETCORE_URLS. La variabile di ambiente configura il server. Il middleware individua indirettamente la porta HTTPS tramite IServerAddressesFeature. Questo approccio non funziona nelle implementazioni di proxy inverso.

  • I modelli Web di ASP.NET Core impostano un URL HTTPS in Properties/launchsettings.json sia per Kestrel che per l'IIS Express. launchsettings.json viene usato solo nel computer locale.

  • Configurare un endpoint URL HTTPS per una distribuzione perimetrale pubblica del Kestrel server o HTTP.sys server. L'app usa una sola porta HTTPS. Il middleware individua la porta tramite IServerAddressesFeature.

Nota

Quando un'app viene eseguita in una configurazione del proxy inverso, IServerAddressesFeature non è disponibile. Impostare la porta usando uno degli altri approcci descritti in questa sezione.

Implementazioni Edge

Quando Kestrel o HTTP.sys vengono utilizzati come server fronte pubblico, Kestrel o HTTP.sys devono essere configurati per l'ascolto su entrambi:

  • Porta sicura in cui viene reindirizzato il client (in genere, 443 nell'ambiente di produzione e 5001 in fase di sviluppo).
  • La porta non sicura (in genere 80 in produzione e 5000 in fase di sviluppo).

La porta non sicura deve essere accessibile dal client per consentire all'app di ricevere una richiesta non sicura e reindirizzare il client alla porta protetta.

Per ulteriori informazioni, vedere la configurazione dell'endpoint o l'implementazione del server web HTTP.sys in ASP.NET Core.

Scenari di distribuzione

Qualsiasi firewall tra il client e il server deve anche avere porte di comunicazione aperte per il traffico.

Se le richieste vengono inoltrate in una configurazione del proxy inverso, usare il middleware delle intestazioni inoltrate prima di chiamare il middleware di reindirizzamento HTTPS. Il middleware delle intestazioni inoltrate aggiorna il Request.Scheme utilizzando l'intestazione X-Forwarded-Proto. Il middleware consente il corretto funzionamento degli URI di reindirizzamento e di altri criteri di sicurezza. Quando il Middleware delle Intestazioni Inoltrate non viene usato, l'applicazione back-end potrebbe non ricevere lo schema corretto e terminare in un ciclo di reindirizzamento. Un messaggio di errore comune dell'utente finale è che si sono verificati troppi reindirizzamenti.

Quando si esegue la distribuzione nel servizio app Azure, seguire le indicazioni riportate in Esercitazione: Associare un certificato SSL personalizzato esistente ad Azure App Web.

Opzioni

Il seguente codice evidenziato chiama AddHttpsRedirection per configurare le opzioni del middleware.

using static Microsoft.AspNetCore.Http.StatusCodes;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();

builder.Services.AddHsts(options =>
{
    options.Preload = true;
    options.IncludeSubDomains = true;
    options.MaxAge = TimeSpan.FromDays(60);
    options.ExcludedHosts.Add("example.com");
    options.ExcludedHosts.Add("www.example.com");
});

builder.Services.AddHttpsRedirection(options =>
{
    options.RedirectStatusCode = Status307TemporaryRedirect;
    options.HttpsPort = 5001;
});

var app = builder.Build();

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();

La chiamata AddHttpsRedirection è necessaria solo per modificare i valori di HttpsPort o RedirectStatusCode.

Il codice evidenziato precedente:

Configurare reindirizzamenti permanenti nell'ambiente di produzione

Il middleware usa per impostazione predefinita l'invio di un oggetto Status307TemporaryRedirect con tutti i reindirizzamenti. Se si preferisce inviare un codice di stato di reindirizzamento permanente quando l'app si trova in un ambiente non di sviluppo, eseguire il wrapping della configurazione delle opzioni middleware in un controllo condizionale per un ambiente non di sviluppo.

Quando si configurano i servizi in Program.cs:

using static Microsoft.AspNetCore.Http.StatusCodes;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();

if (!builder.Environment.IsDevelopment())
{
    builder.Services.AddHttpsRedirection(options =>
    {
        options.RedirectStatusCode = Status308PermanentRedirect;
        options.HttpsPort = 443;
    });
}

var app = builder.Build();

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");

    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();

Approccio alternativo al middleware di reindirizzamento HTTPS

Un'alternativa all'uso del middleware di reindirizzamento HTTPS (UseHttpsRedirection) consiste nell'usare il middleware di riscrittura URL (AddRedirectToHttps). AddRedirectToHttps può anche impostare il codice di stato e la porta quando viene eseguito il reindirizzamento. Per altre informazioni, vedere Middleware di riscrittura URL.

Quando si reindirizza a HTTPS senza il requisito di regole di reindirizzamento aggiuntive, è consigliabile usare il middleware di reindirizzamento HTTPS (UseHttpsRedirection) descritto in questo articolo.

HTTP Strict Transport Security Protocol (HSTS)

Per OWASP, HTTP Strict Transport Security (HSTS) è un miglioramento della sicurezza di consenso esplicito specificato da un'app Web tramite l'uso di un'intestazione di risposta. Quando un browser che supporta HSTS riceve questa intestazione:

  • Il browser archivia la configurazione per il dominio che impedisce l'invio di comunicazioni tramite HTTP. Il browser forza tutte le comunicazioni tramite HTTPS.
  • Il browser impedisce all'utente di usare certificati non attendibili o non validi. Il browser disabilita le richieste che consentono a un utente di considerare temporaneamente attendibile tale certificato.

Poiché HSTS viene applicato dal client, presenta alcune limitazioni:

  • Il client deve supportare HSTS.
  • HSTS richiede almeno una richiesta HTTPS riuscita per stabilire i criteri HSTS.
  • L'applicazione deve controllare ogni richiesta HTTP e reindirizzare o rifiutare la richiesta HTTP.

ASP.NET Core implementa HSTS con il UseHsts metodo di estensione. Il codice seguente chiama UseHsts quando l'app non è in modalità di sviluppo:

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();

var app = builder.Build();

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();

UseHsts non è consigliato in fase di sviluppo perché le impostazioni HSTS sono altamente memorizzabili nella cache dai browser. Per impostazione predefinita, UseHsts esclude l'indirizzo di loopback locale.

Per gli ambienti di produzione che implementano HTTPS per la prima volta, inizializzare HstsOptions.MaxAge con un valore ridotto usando uno dei metodi TimeSpan. Impostare il valore da ore a non più di un singolo giorno nel caso in cui sia necessario ripristinare l'infrastruttura HTTPS su HTTP. Dopo aver fiducia nella sostenibilità della configurazione HTTPS, aumentare il valore HSTS max-age ; un valore comunemente usato è un anno.

Il codice evidenziato seguente:

using static Microsoft.AspNetCore.Http.StatusCodes;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();

builder.Services.AddHsts(options =>
{
    options.Preload = true;
    options.IncludeSubDomains = true;
    options.MaxAge = TimeSpan.FromDays(60);
    options.ExcludedHosts.Add("example.com");
    options.ExcludedHosts.Add("www.example.com");
});

builder.Services.AddHttpsRedirection(options =>
{
    options.RedirectStatusCode = Status307TemporaryRedirect;
    options.HttpsPort = 5001;
});

var app = builder.Build();

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();
  • Imposta il parametro preload dell'intestazione Strict-Transport-Security. Il precaricamento non fa parte della specifica RFC HSTS, ma è supportato dai browser web per precaricare i siti HSTS in una nuova installazione. Per ulteriori informazioni, vedere https://hstspreload.org/.
  • Abilita includeSubDomain, che applica il criterio HSTS ai sottodomini host.
  • Imposta in modo esplicito il max-age parametro dell'intestazione Strict-Transport-Security su 60 giorni. Se non è impostato, il valore predefinito è 30 giorni. Per ulteriori informazioni, consultare la direttiva max-age.
  • Aggiunge example.com all'elenco di host da escludere.

UseHsts esclude gli host di loopback seguenti:

  • localhost : indirizzo di loopback IPv4.
  • 127.0.0.1 : Indirizzo di loopback IPv4.
  • [::1] : l'indirizzo di loopback IPv6.

Rifiutare esplicitamente HTTPS/HSTS alla creazione del progetto

In alcuni scenari di servizio back-end in cui la sicurezza della connessione viene gestita nel perimetro pubblico della rete, la configurazione della sicurezza delle connessioni in ogni nodo non è necessaria. Le app Web generate dai modelli in Visual Studio o dal comando dotnet new abilitano il reindirizzamento HTTPS e HSTS. Per le distribuzioni che non richiedono questi scenari, è possibile rifiutare esplicitamente HTTPS/HSTS quando l'app viene creata dal modello.

Per rifiutare esplicitamente HTTPS/HSTS:

Deselezionare la casella di controllo Configura per HTTPS.

Nuova finestra di dialogo ASP.NET Core Web Application con la casella di controllo Configura per HTTPS deselezionata.

Considerare attendibile il certificato di sviluppo HTTPS di ASP.NET Core in Windows e macOS

Per il browser Firefox, vedere la sezione successiva.

.NET Core SDK include un certificato di sviluppo HTTPS. Il certificato viene installato come parte dell'esperienza di prima esecuzione. Ad esempio, dotnet --info produce una variante dell'output seguente:

ASP.NET Core
------------
Successfully installed the ASP.NET Core HTTPS Development Certificate.
To trust the certificate run 'dotnet dev-certs https --trust' (Windows and macOS only).
For establishing trust on other platforms refer to the platform specific documentation.
For more information on configuring HTTPS see https://go.microsoft.com/fwlink/?linkid=848054.

L'installazione di .NET Core SDK include l'installazione del certificato di sviluppo HTTPS ASP.NET Core nell'archivio certificati utente locale. Il certificato è stato installato, ma non è attendibile. Per considerare attendibile il certificato, eseguire il passaggio una tantum per avviare lo strumento dotnet dev-certs.

dotnet dev-certs https --trust

Il comando seguente fornisce aiuto per lo strumento dotnet dev-certs:

dotnet dev-certs https --help

Avviso

Non creare un certificato di sviluppo in un ambiente che verrà ridistribuito, ad esempio un'immagine del contenitore o una macchina virtuale. Un'azione del genere può portare al verificarsi di spoofing e all'elevazione dei privilegi. Per evitare questo problema, impostare la DOTNET_GENERATE_ASPNET_CERTIFICATE variabile di ambiente su false prima di chiamare l'interfaccia della riga di comando di .NET per la prima volta. Questa operazione ignora la generazione automatica del certificato di sviluppo ASP.NET Core durante la prima esecuzione dell'interfaccia della riga di comando.

Accettare come attendibile il certificato HTTPS con Firefox per evitare l'errore SEC_ERROR_INADEQUATE_KEY_USAGE.

Il browser Firefox usa il proprio archivio certificati e pertanto non considera attendibili i certificati IIS Express o Kestrel developer.

Esistono due approcci per considerare attendibile il certificato HTTPS con Firefox, creare un file di criteri o configurarlo con il browser FireFox. La configurazione con il browser crea il file di criteri, quindi i due approcci sono equivalenti.

Creare un file di criteri per considerare attendibile il certificato HTTPS con Firefox

Creare un file di criteri (policies.json) in:

Aggiungere il codice JSON seguente al file dei criteri di Firefox:

{
  "policies": {
    "Certificates": {
      "ImportEnterpriseRoots": true
    }
  }
}

Il file di criteri precedente fa sì che Firefox consideri attendibili i certificati provenienti dai certificati attendibili nell'archivio certificati di Windows. La sezione successiva fornisce un approccio alternativo per creare il file di criteri precedente usando il browser Firefox.

Configurare l'attendibilità del certificato HTTPS tramite il browser Firefox

Impostare security.enterprise_roots.enabled = true usando le istruzioni seguenti:

  1. Immettere about:config nel browser FireFox.
  2. Selezionare Accettare il rischio e continuare se si accetta il rischio.
  3. Selezionare Mostra tutto
  4. Impostare security.enterprise_roots.enabled = true
  5. Uscire e riavviare Firefox

Per altre informazioni, vedere Configurazione di autorità di certificazione (CA) in Firefox e il file mozilla/policy-templates/README.

Come configurare un certificato per sviluppatore per Docker

Vedere il problema in GitHub.

Considerare attendibile il certificato HTTPS in Linux

Stabilire l'attendibilità è specifico alla distribuzione e al browser. Le sezioni seguenti forniscono istruzioni per alcune distribuzioni popolari e i browser Chromium (Edge e Chrome) e per Firefox.

Ubuntu considera attendibile il certificato per la comunicazione da servizio a servizio

Le istruzioni seguenti non funzionano per alcune versioni di Ubuntu, ad esempio 20.04. Per altre informazioni, vedere Problema di GitHub dotnet/AspNetCore.Docs #23686.

  1. Installare OpenSSL 1.1.1h o versione successiva. Per istruzioni su come aggiornare OpenSSL, vedere la distribuzione.

  2. Eseguire i comandi seguenti:

    dotnet dev-certs https
    sudo -E dotnet dev-certs https -ep /usr/local/share/ca-certificates/aspnet/https.crt --format PEM
    sudo update-ca-certificates
    

I comandi precedenti:

  • Verificare che il certificato per sviluppatore dell'utente corrente sia stato creato.
  • Esporta il certificato con autorizzazioni elevate necessarie per la ca-certificates cartella, usando l'ambiente dell'utente corrente.
  • La rimozione della bandiera -E esporta il certificato utente radice, generandolo se necessario. Ogni certificato appena generato ha un'impronta digitale diversa. Quando si esegue come root, sudo e -E non sono necessari.

Il percorso nel comando precedente è specifico per Ubuntu. Per altre distribuzioni, selezionare un percorso appropriato o usare il percorso per le autorità di certificazione (CA).

Considerare attendibile il certificato HTTPS in Linux usando Edge o Chrome

Per i browser Chromium su Linux:

  • Installa il libnss3-tools per la distribuzione.

  • Creare o verificare che la $HOME/.pki/nssdb cartella esista nel computer.

  • Esportare il certificato con il comando seguente:

    dotnet dev-certs https
    sudo -E dotnet dev-certs https -ep /usr/local/share/ca-certificates/aspnet/https.crt --format PEM
    

    Il percorso nel comando precedente è specifico per Ubuntu. Per altre distribuzioni, selezionare un percorso appropriato o usare il percorso per le autorità di certificazione (CA).

  • Eseguire i comandi seguenti:

    certutil -d sql:$HOME/.pki/nssdb -A -t "P,," -n localhost -i /usr/local/share/ca-certificates/aspnet/https.crt
    
  • Uscire e riavviare il browser.

Considerare attendibile il certificato con Firefox in Linux

  • Esportare il certificato con il comando seguente:

    dotnet dev-certs https
    sudo -E dotnet dev-certs https -ep /usr/local/share/ca-certificates/aspnet/https.crt --format PEM
    

    Il percorso nel comando precedente è specifico per Ubuntu. Per altre distribuzioni, selezionare un percorso appropriato o usare il percorso per le autorità di certificazione (CA).

  • Creare un file JSON in /usr/lib/firefox/distribution/policies.json con il comando seguente:

cat <<EOF | sudo tee /usr/lib/firefox/distribution/policies.json
{
    "policies": {
        "Certificates": {
            "Install": [
                "/usr/local/share/ca-certificates/aspnet/https.crt"
            ]
        }
    }
}
EOF

Nota: Ubuntu 21.10 Firefox viene fornito come pacchetto snap e la cartella di installazione è /snap/firefox/current/usr/lib/firefox.

Vedere Configurare l'attendibilità del certificato HTTPS usando il browser Firefox in questo articolo per un modo alternativo per configurare il file di criteri usando il browser.

Considerare attendibile il certificato con Fedora 34

Vedere:

Considerare attendibile il certificato per altre distribuzioni

Vedere il problema in GitHub.

Considerare attendibile il certificato HTTPS nel sottosistema Windows per Linux

Le istruzioni seguenti non funzionano per alcune distribuzioni linux, ad esempio Ubuntu 20.04. Per altre informazioni, vedere Problema di GitHub dotnet/AspNetCore.Docs #23686.

Il sottosistema Windows per Linux (WSL) genera un certificato di sviluppo autofirmato HTTPS, che per impostazione predefinita non è attendibile in Windows. Il modo più semplice per considerare attendibile il certificato WSL di Windows consiste nel configurare WSL per l'uso dello stesso certificato di Windows:

  • In Windows esportare il certificato per sviluppatore in un file:

    dotnet dev-certs https -ep https.pfx -p $CREDENTIAL_PLACEHOLDER$ --trust
    

    Dove $CREDENTIAL_PLACEHOLDER$ è una password.

  • In una finestra WSL importare il certificato esportato nell'istanza WSL:

    dotnet dev-certs https --clean --import <<path-to-pfx>> --password $CREDENTIAL_PLACEHOLDER$
    

L'approccio precedente è un'operazione da eseguire una sola volta per ogni certificato e per ogni distribuzione WSL. È più semplice che esportare il certificato più volte. Se si aggiorna o si rigenera il certificato in Windows, potrebbe essere necessario eseguire di nuovo i comandi precedenti.

Risolvi i problemi relativi ai certificati, ad esempio il certificato non attendibile

Questa sezione fornisce informazioni utili quando il certificato di sviluppo HTTPS core ASP.NET è stato installato e attendibile, ma sono ancora presenti avvisi del browser che il certificato non è attendibile. Il certificato di sviluppo HTTPS core ASP.NET viene usato da Kestrel.

Per ripristinare il certificato IIS Express, vedere questo problema di Stackoverflow .

Tutte le piattaforme : certificato non attendibile

Eseguire i comandi seguenti:

dotnet dev-certs https --clean
dotnet dev-certs https --trust

Chiudere tutte le istanze del browser aperte. Aprire una nuova finestra del browser per l'app. L'attendibilità del certificato viene memorizzata nella cache dai browser.

dotnet dev-certs https --clean non riesce

I comandi precedenti risolveranno la maggior parte dei problemi di attendibilità del browser. Se il browser non considera attendibile il certificato, seguire i suggerimenti specifici della piattaforma che seguono.

Docker : certificato non attendibile

  • Eliminare la cartella C:\Users{USER}\AppData\Roaming\ASP.NET\Https .
  • Pulire la soluzione. Eliminare le cartelle bin e obj.
  • Riavviare lo strumento di sviluppo. Ad esempio, Visual Studio o Visual Studio Code.

Windows - Certificato non attendibile

  • Controllare i certificati nell'archivio certificati. Deve essere presente un localhost certificato con il ASP.NET Core HTTPS development certificate nome descrittivo sia in Current User > Personal > Certificates che Current User > Trusted root certification authorities > Certificates
  • Rimuovere tutti i certificati trovati sia dalle autorità di certificazione personali che dalle autorità di certificazione radice attendibili. Non rimuovere il certificato localhost di IIS Express.
  • Eseguire i comandi seguenti:
dotnet dev-certs https --clean
dotnet dev-certs https --trust

Chiudere tutte le istanze del browser aperte. Aprire una nuova finestra del browser per l'app.

OS X - Certificato non attendibile

  • Apri KeyChain Access.
  • Selezionare il portachiavi di sistema.
  • Verificare la presenza di un certificato localhost.
  • Verificare che contenga un + simbolo sull'icona per indicare che è attendibile per tutti gli utenti.
  • Rimuovere il certificato dal portachiavi di sistema.
  • Eseguire i comandi seguenti:
dotnet dev-certs https --clean
dotnet dev-certs https --trust

Chiudere tutte le istanze del browser aperte. Aprire una nuova finestra del browser per l'app.

Per la risoluzione dei problemi relativi ai certificati con Visual Studio, vedere Errore HTTPS con IIS Express (dotnet/AspNetCore #16892 ).

Certificato Linux non attendibile

Verificare che il certificato configurato per l'attendibilità sia il certificato per sviluppatore HTTPS utente che verrà usato dal Kestrel server.

Controllare il certificato per sviluppatore Kestrel HTTPS predefinito dell'utente corrente nel percorso seguente:

ls -la ~/.dotnet/corefx/cryptography/x509stores/my

Il file del certificato sviluppatore Kestrel HTTPS è l'impronta digitale SHA1. Quando il file viene eliminato tramite dotnet dev-certs https --clean, viene rigenerato, se necessario, con un'impronta digitale diversa. Verificare che l'impronta digitale del certificato esportato sia conforme al risultato del comando seguente.

openssl x509 -noout -fingerprint -sha1 -inform pem -in /usr/local/share/ca-certificates/aspnet/https.crt

Se il certificato non corrisponde, potrebbe essere uno dei seguenti:

  • Un certificato precedente.
  • È stato esportato un certificato sviluppatore per l'utente root. In questo caso, esportare il certificato.

Il certificato root può essere verificato a:

ls -la /root/.dotnet/corefx/cryptography/x509stores/my

Certificato SSL di IIS Express usato con Visual Studio

Per risolvere i problemi relativi al certificato IIS Express, selezionare Ripristina dal programma di installazione di Visual Studio. Per altre informazioni, vedere questo problema in GitHub.

I criteri di gruppo impediscono ai certificati autofirmati di essere considerati affidabili

In alcuni casi, i criteri di gruppo potrebbero impedire l'attendibilità dei certificati autofirmati. Per altre informazioni, vedere questo problema in GitHub.

Informazioni aggiuntive

Avviso

Progetti API

Non usare RequireHttpsAttribute nelle API Web che ricevono informazioni riservate. RequireHttpsAttribute usa i codici di stato HTTP per reindirizzare i browser da HTTP a HTTPS. I client API potrebbero non comprendere o obbedire ai reindirizzamenti da HTTP a HTTPS. Tali client possono inviare informazioni su HTTP. Le API Web devono:

  • Non è in ascolto su HTTP.
  • Chiudere la connessione con il codice di stato 400 (Richiesta non valida) e non gestire la richiesta.

Per disabilitare il reindirizzamento HTTP in un'API, impostare la ASPNETCORE_URLS variabile di ambiente o usare il flag della --urls riga di comando. Per altre informazioni, vedere Usare più ambienti in ASP.NET Core e 5 modi per impostare gli URL per un'app ASP.NET Core di Andrew Lock.

Progetti HSTS e API

I progetti API predefiniti non includono HSTS perché HSTS è in genere un'istruzione solo browser. Altri chiamanti, ad esempio le app per telefono o desktop, non obbediscono all'istruzione. Anche all'interno dei browser, una singola chiamata autenticata a un'API tramite HTTP presenta rischi per le reti non sicure. L'approccio sicuro consiste nel configurare i progetti API in modo che ascoltino e rispondano solo tramite HTTPS.

Richiedere HTTPS

Consigliamo che le app Web ASP.NET Core di produzione siano usate:

  • Middleware di reindirizzamento HTTPS (UseHttpsRedirection) per reindirizzare le richieste HTTP a HTTPS.
  • HSTS Middleware (UseHsts) per inviare ai client le intestazioni del protocollo HTTP Strict Transport Security (HSTS).

Nota

Le app distribuite in una configurazione del proxy inverso consentono al proxy di gestire la sicurezza delle connessioni (HTTPS). Se il proxy gestisce anche il reindirizzamento HTTPS, non è necessario usare il middleware di reindirizzamento HTTPS. Se il server proxy gestisce anche la scrittura di intestazioni HSTS (ad esempio, il supporto HSTS nativo in IIS 10.0 (1709) o versione successiva, il middleware HSTS non è richiesto dall'app. Per ulteriori informazioni, vedere Escludere HTTPS/HSTS alla creazione del progetto.

UseHttpsRedirection

Il codice seguente chiama UseHttpsRedirection nella classe Startup:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseExceptionHandler("/Error");
        // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
        app.UseHsts();
    }

    app.UseHttpsRedirection();
    app.UseStaticFiles();

    app.UseRouting();

    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapRazorPages();
    });
}

Il codice evidenziato precedente:

È consigliabile usare reindirizzamenti temporanei anziché reindirizzamenti permanenti. La memorizzazione nella cache dei collegamenti può causare un comportamento instabile negli ambienti di sviluppo. Se si preferisce inviare un codice di stato di reindirizzamento permanente quando l'app si trova in un ambiente non di sviluppo, vedere la sezione Configurare reindirizzamenti permanenti nell'ambiente di produzione . È consigliabile usare HSTS per segnalare ai client che devono essere inviate solo richieste di risorse sicure all'app (solo in produzione).

Configurazione della porta

Una porta deve essere disponibile per il middleware per reindirizzare una richiesta non sicura a HTTPS. Se non è disponibile alcuna porta:

  • Il reindirizzamento a HTTPS non si verifica.
  • Il middleware registra l'avviso "Impossibile determinare la porta https per il reindirizzamento".

Specificare la porta HTTPS usando uno degli approcci seguenti:

  • Impostare HttpsRedirectionOptions.HttpsPort.

  • Configura l'impostazione dell'host https_port:

    • Nella configurazione dell'host.

    • Impostando la ASPNETCORE_HTTPS_PORT variabile di ambiente.

    • Aggiungendo una voce di primo livello in appsettings.json:

      {
          "https_port": 443,
          "Logging": {
              "LogLevel": {
                  "Default": "Information",
                  "Microsoft": "Warning",
                  "Microsoft.Hosting.Lifetime": "Information"
              }
          },
          "AllowedHosts": "*"
      }
      
  • Indicare una porta con lo schema sicuro usando la variabile di ambiente ASPNETCORE_URLS. La variabile di ambiente configura il server. Il middleware individua indirettamente la porta HTTPS tramite IServerAddressesFeature. Questo approccio non funziona nelle implementazioni del proxy inverso.

  • In fase di sviluppo, configurare un URL HTTPS in launchsettings.json. Abilitare HTTPS quando si usa IIS Express.

  • Configurare un endpoint URL HTTPS per una distribuzione perimetrale pubblica del Kestrel server o HTTP.sys server. L'app usa una sola porta HTTPS. Il middleware individua la porta tramite IServerAddressesFeature.

Nota

Quando un'app viene eseguita in una configurazione del proxy inverso, IServerAddressesFeature non è disponibile. Impostare la porta usando uno degli altri approcci descritti in questa sezione.

Distribuzioni periferiche

Quando Kestrel o HTTP.sys viene usato come server perimetrale pubblico, Kestrel o HTTP.sys deve essere configurato per l'ascolto su entrambi:

  • Porta sicura in cui viene reindirizzato il client (in genere, 443 nell'ambiente di produzione e 5001 in fase di sviluppo).
  • Porta non sicura (in genere 80 in produzione e 5000 in fase di sviluppo).

La porta non sicura deve essere accessibile dal client per consentire all'app di ricevere una richiesta non sicura e reindirizzare il client alla porta protetta.

Per altre informazioni, vedere la configurazione dell'endpoint o l'implementazione del server Web HTTP.sys in ASP.NET Core.

Scenari di distribuzione

Qualsiasi firewall tra il client e il server deve anche avere porte di comunicazione aperte per il traffico.

Se le richieste vengono inoltrate in una configurazione del proxy inverso, usare il middleware delle intestazioni inoltrate prima di chiamare il middleware di reindirizzamento HTTPS. Il middleware delle intestazioni inoltrate aggiorna Request.Scheme utilizzando l'intestazione X-Forwarded-Proto. Il middleware consente il corretto funzionamento degli URI di reindirizzamento e di altri criteri di sicurezza. Quando il middleware delle intestazioni inoltrate non viene usato, l'app back-end potrebbe non ricevere lo schema corretto e terminare in un ciclo di reindirizzamento. Un messaggio di errore comune dell'utente finale è che si sono verificati troppi reindirizzamenti.

Quando si esegue la distribuzione nel servizio app Azure, seguire le indicazioni riportate in Esercitazione: Associare un certificato SSL personalizzato esistente ad Azure App Web.

Opzioni

Il seguente codice evidenziato chiama AddHttpsRedirection per configurare le opzioni del middleware.

public void ConfigureServices(IServiceCollection services)
{
    services.AddRazorPages();

    services.AddHsts(options =>
    {
        options.Preload = true;
        options.IncludeSubDomains = true;
        options.MaxAge = TimeSpan.FromDays(60);
        options.ExcludedHosts.Add("example.com");
        options.ExcludedHosts.Add("www.example.com");
    });

    services.AddHttpsRedirection(options =>
    {
        options.RedirectStatusCode = (int) HttpStatusCode.TemporaryRedirect;
        options.HttpsPort = 5001;
    });
}

La chiamata AddHttpsRedirection è necessaria solo per modificare i valori di HttpsPort o RedirectStatusCode.

Il codice evidenziato precedente:

Configurare reindirizzamenti permanenti nell'ambiente di produzione

Il middleware usa per impostazione predefinita l'invio di un oggetto Status307TemporaryRedirect con tutti i reindirizzamenti. Se si preferisce inviare un codice di stato di reindirizzamento permanente quando l'app si trova in un ambiente non di sviluppo, incapsulare la configurazione delle opzioni middleware in un controllo condizionale per un ambiente non di sviluppo.

Quando si configurano i servizi in Startup.cs:

public void ConfigureServices(IServiceCollection services)
{
    // IWebHostEnvironment (stored in _env) is injected into the Startup class.
    if (!_env.IsDevelopment())
    {
        services.AddHttpsRedirection(options =>
        {
            options.RedirectStatusCode = (int) HttpStatusCode.PermanentRedirect;
            options.HttpsPort = 443;
        });
    }
}

Approccio alternativo al middleware di reindirizzamento HTTPS

Un'alternativa all'uso del middleware di reindirizzamento HTTPS (UseHttpsRedirection) consiste nell'usare il middleware di riscrittura URL (AddRedirectToHttps). AddRedirectToHttps può anche impostare il codice di stato e la porta quando viene eseguito il reindirizzamento. Per ulteriori informazioni, vedere Middleware per la riscrittura degli URL.

Quando si reindirizza a HTTPS senza il requisito di regole di reindirizzamento aggiuntive, è consigliabile usare il middleware di reindirizzamento HTTPS (UseHttpsRedirection) descritto in questo articolo.

HTTP Strict Transport Security Protocol (HSTS)

Per OWASP, HTTP Strict Transport Security (HSTS) è un miglioramento della sicurezza di consenso esplicito specificato da un'app Web tramite l'uso di un'intestazione di risposta. Quando un browser che supporta HSTS riceve questa intestazione:

  • Il browser archivia la configurazione per il dominio che impedisce l'invio di comunicazioni tramite HTTP. Il browser forza tutte le comunicazioni tramite HTTPS.
  • Il browser impedisce all'utente di usare certificati non attendibili o non validi. Il browser disabilita le richieste che consentono a un utente di considerare temporaneamente attendibile tale certificato.

Poiché HSTS viene applicato dal client, presenta alcune limitazioni:

  • Il client deve supportare HSTS.
  • HSTS richiede almeno una richiesta HTTPS riuscita per stabilire i criteri HSTS.
  • L'applicazione deve controllare ogni richiesta HTTP e reindirizzare o rifiutare la richiesta HTTP.

ASP.NET Core implementa HSTS con il UseHsts metodo di estensione. Il codice seguente chiama UseHsts quando l'app non è in modalità di sviluppo:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseExceptionHandler("/Error");
        // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
        app.UseHsts();
    }

    app.UseHttpsRedirection();
    app.UseStaticFiles();

    app.UseRouting();

    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapRazorPages();
    });
}

UseHsts non è consigliato in fase di sviluppo perché le impostazioni HSTS sono altamente memorizzabili nella cache dai browser. Per impostazione predefinita, UseHsts esclude l'indirizzo di loopback locale.

Per gli ambienti di produzione che implementano HTTPS per la prima volta, impostare il HstsOptions.MaxAge iniziale su un valore ridotto usando uno dei metodi TimeSpan. Impostare il valore da ore a non più di un singolo giorno nel caso in cui sia necessario ripristinare l'infrastruttura HTTPS su HTTP. Dopo aver fiducia nella sostenibilità della configurazione HTTPS, aumentare il valore HSTS max-age ; un valore comunemente usato è un anno.

Il codice seguente:

public void ConfigureServices(IServiceCollection services)
{
    services.AddRazorPages();

    services.AddHsts(options =>
    {
        options.Preload = true;
        options.IncludeSubDomains = true;
        options.MaxAge = TimeSpan.FromDays(60);
        options.ExcludedHosts.Add("example.com");
        options.ExcludedHosts.Add("www.example.com");
    });

    services.AddHttpsRedirection(options =>
    {
        options.RedirectStatusCode = (int) HttpStatusCode.TemporaryRedirect;
        options.HttpsPort = 5001;
    });
}
  • Imposta il parametro di precaricamento dell'intestazione Strict-Transport-Security. Il precaricamento non fa parte della specifica RFC HSTS, ma è supportato dai browser web per precaricare i siti HSTS in caso di nuova installazione. Per ulteriori informazioni, vedere https://hstspreload.org/.
  • Abilita includeSubDomain, che applica il criterio HSTS ai sottodomini host.
  • Imposta in modo esplicito il max-age parametro dell'intestazione Strict-Transport-Security su 60 giorni. Se non è impostato, il valore predefinito è 30 giorni. Per altre informazioni, vedere la direttiva max-age.
  • Aggiunge example.com all'elenco di host da escludere.

UseHsts esclude gli host di loopback seguenti:

  • localhost : L'indirizzo di loopback IPv4.
  • 127.0.0.1 : indirizzo di loopback IPv4.
  • [::1] : L'indirizzo di loopback IPv6.

Rifiutare esplicitamente HTTPS/HSTS alla creazione del progetto

In alcuni scenari di servizio back-end in cui la sicurezza della connessione viene gestita nel perimetro pubblico della rete, la configurazione della sicurezza delle connessioni in ogni nodo non è necessaria. Le app Web generate dai modelli in Visual Studio o dal comando dotnet new abilitano il reindirizzamento HTTPS e HSTS. Per le distribuzioni che non richiedono questi scenari, è possibile rifiutare esplicitamente HTTPS/HSTS quando l'app viene creata dal modello.

Per rifiutare esplicitamente HTTPS/HSTS:

Deselezionare la casella di controllo Configura per HTTPS.

Finestra di dialogo per informazioni aggiuntive del nuovo modello di app Web ASP.NET Core, mostrando la casella di controllo Configura per HTTPS

Considerare attendibile il certificato di sviluppo HTTPS di ASP.NET Core in Windows e macOS

Per il browser Firefox, vedere la sezione successiva.

.NET Core SDK include un certificato di sviluppo HTTPS. Il certificato viene installato come parte dell'esperienza di prima esecuzione. Ad esempio, l'esecuzione dotnet new webapp per la prima volta produce una variazione dell'output seguente:

Installed an ASP.NET Core HTTPS development certificate.
To trust the certificate, run 'dotnet dev-certs https --trust'
Learn about HTTPS: https://aka.ms/dotnet-https

L'installazione di .NET Core SDK include l'installazione del certificato di sviluppo HTTPS ASP.NET Core nell'archivio certificati utente locale. Il certificato è stato installato, ma non è attendibile. Per considerare attendibile il certificato, completare una tantum il passaggio di esecuzione dello strumento dotnet dev-certs.

dotnet dev-certs https --trust

Il seguente comando fornisce aiuto sullo strumento dotnet dev-certs:

dotnet dev-certs https --help

Avviso

Non creare un certificato di sviluppo in un ambiente che verrà ridistribuito, ad esempio un'immagine del contenitore o una macchina virtuale. Questo può portare allo spoofing e all'elevazione di privilegi. Per evitare questo problema, impostare la DOTNET_GENERATE_ASPNET_CERTIFICATE variabile di ambiente su false prima di chiamare l'interfaccia della riga di comando di .NET per la prima volta. Questa operazione ignora la generazione automatica del certificato di sviluppo ASP.NET Core durante la prima esecuzione dell'interfaccia della riga di comando.

Fidati del certificato HTTPS con Firefox per evitare l'errore SEC_ERROR_INADEQUATE_KEY_USAGE.

Il browser Firefox usa il proprio archivio certificati e pertanto non considera attendibili i certificati IIS Express o Kestrel developer.

Esistono due approcci per considerare attendibile il certificato HTTPS con Firefox, creare un file di criteri o configurarlo con il browser FireFox. La configurazione con il browser crea il file di criteri, quindi i due approcci sono equivalenti.

Creare un file di criteri per considerare attendibile il certificato HTTPS con Firefox

Creare un file di politica (policies.json) in:

Aggiungere il codice JSON seguente al file dei criteri di Firefox:

{
  "policies": {
    "Certificates": {
      "ImportEnterpriseRoots": true
    }
  }
}

Il file di criteri precedente fa sì che Firefox consideri attendibili i certificati provenienti dall'archivio certificati certificati attendibili di Windows. La sezione successiva fornisce un approccio alternativo per creare il file di criteri precedente usando il browser Firefox.

Configurare l'attendibilità del certificato HTTPS tramite il browser Firefox

Impostare security.enterprise_roots.enabled = true usando le istruzioni seguenti:

  1. Immettere about:config nel browser FireFox.
  2. Selezionare Accettare il rischio e continuare se si accetta il rischio.
  3. Selezionare Mostra tutto.
  4. Impostare security.enterprise_roots.enabled = true.
  5. Uscire e riavviare Firefox.

Per altre informazioni, vedere Configurazione di autorità di certificazione (CA) in Firefox e il file mozilla/policy-templates/README.

Come configurare un certificato per sviluppatore per Docker

Vedere il problema in GitHub.

Considerare attendibile il certificato HTTPS in Linux

Stabilire la fiducia è specifico per la distribuzione e il browser. Le sezioni seguenti forniscono istruzioni per alcune distribuzioni popolari e i browser Chromium (Edge e Chrome) e per Firefox.

Ubuntu considera attendibile il certificato per la comunicazione da servizio a servizio

  1. Installare OpenSSL 1.1.1h o versione successiva. Per istruzioni su come aggiornare OpenSSL, vedere la distribuzione.

  2. Eseguire i comandi seguenti:

    dotnet dev-certs https
    sudo -E dotnet dev-certs https -ep /usr/local/share/ca-certificates/aspnet/https.crt --format PEM
    sudo update-ca-certificates
    

I comandi precedenti:

  • Verificare che il certificato per sviluppatore dell'utente corrente sia stato creato.
  • Esportare il certificato con autorizzazioni elevate necessarie per la ca-certificates cartella usando l'ambiente dell'utente corrente.
  • Rimuovere il -E flag per esportare il certificato utente radice, generandolo se necessario. Ogni certificato appena generato ha un'impronta digitale diversa. Quando si esegue come utente root, sudo e -E non sono necessari.

Il percorso nel comando precedente è specifico per Ubuntu. Per altre distribuzioni, selezionare un percorso appropriato o usare il percorso per le autorità di certificazione (CA).

Considerare attendibile il certificato HTTPS in Linux usando Edge o Chrome

Per i browser Chromium su Linux:

  • Installa il libnss3-tools per la tua distribuzione.

  • Creare o verificare che la $HOME/.pki/nssdb cartella esista nel computer.

  • Esportare il certificato con il comando seguente:

    dotnet dev-certs https
    sudo -E dotnet dev-certs https -ep /usr/local/share/ca-certificates/aspnet/https.crt --format PEM
    

    Il percorso nel comando precedente è specifico per Ubuntu. Per altre distribuzioni, selezionare un percorso appropriato o usare il percorso per le autorità di certificazione (CA).

  • Eseguire i comandi seguenti:

    certutil -d sql:$HOME/.pki/nssdb -A -t "P,," -n localhost -i /usr/local/share/ca-certificates/aspnet/https.crt
    
  • Uscire e riavviare il browser.

Considerare attendibile il certificato con Firefox in Linux

  • Esportare il certificato con il comando seguente:

    dotnet dev-certs https
    sudo -E dotnet dev-certs https -ep /usr/local/share/ca-certificates/aspnet/https.crt --format PEM
    

    Il percorso nel comando precedente è specifico per Ubuntu. Per altre distribuzioni, selezionare un percorso appropriato o usare il percorso per le autorità di certificazione (CA).

  • Creare un file JSON in /usr/lib/firefox/distribution/policies.json con il contenuto seguente:

cat <<EOF | sudo tee /usr/lib/firefox/distribution/policies.json
{
    "policies": {
        "Certificates": {
            "Install": [
                "/usr/local/share/ca-certificates/aspnet/https.crt"
            ]
        }
    }
}
EOF

Vedere Configurare l'attendibilità del certificato HTTPS usando il browser Firefox in questo articolo per un modo alternativo per configurare il file di criteri usando il browser.

Considerare attendibile il certificato con Fedora 34

Firefox su Fedora

echo 'pref("general.config.filename", "firefox.cfg");
pref("general.config.obscure_value", 0);' > ./autoconfig.js

echo '//Enable policies.json
lockPref("browser.policies.perUserDir", false);' > firefox.cfg

echo "{
    \"policies\": {
        \"Certificates\": {
            \"Install\": [
                \"aspnetcore-localhost-https.crt\"
            ]
        }
    }
}" > policies.json

dotnet dev-certs https -ep localhost.crt --format PEM

sudo mv autoconfig.js /usr/lib64/firefox/
sudo mv firefox.cfg /usr/lib64/firefox/
sudo mv policies.json /usr/lib64/firefox/distribution/
mkdir -p ~/.mozilla/certificates
cp localhost.crt ~/.mozilla/certificates/aspnetcore-localhost-https.crt
rm localhost.crt

Autorizza dotnet-to-dotnet su Fedora

sudo cp localhost.crt /etc/pki/tls/certs/localhost.pem
sudo update-ca-trust
rm localhost.crt

Per altre informazioni, vedere questo commento di GitHub.

Considerare attendibile il certificato con altre distribuzioni

Vedere il problema in GitHub.

Riconoscere come attendibile il certificato HTTPS dal sottosistema Windows per Linux

Il sottosistema Windows per Linux (WSL) genera un certificato di sviluppo autofirmato HTTPS. Per configurare l'archivio certificati di Windows in modo che consideri attendibile il certificato WSL:

  • Esportare il certificato per sviluppatore in un file in Windows:

    dotnet dev-certs https -ep C:\<<path-to-folder>>\aspnetcore.pfx -p $CREDENTIAL_PLACEHOLDER$
    

    Dove $CREDENTIAL_PLACEHOLDER$ è una password.

  • In una finestra WSL importare il certificato esportato nell'istanza WSL:

    dotnet dev-certs https --clean --import /mnt/c/<<path-to-folder>>/aspnetcore.pfx -p $CREDENTIAL_PLACEHOLDER$
    

L'approccio precedente consiste in un'operazione eseguibile una sola volta per ciascun certificato e ciascuna distribuzione WSL. È più semplice che esportare il certificato più volte. Se si aggiorna o si rigenera il certificato in Windows, potrebbe essere necessario eseguire di nuovo i comandi precedenti.

Risolvi i problemi relativi ai certificati, ad esempio il certificato non attendibile

Questa sezione fornisce informazioni utili quando il certificato di sviluppo HTTPS core ASP.NET è stato installato e attendibile, ma sono ancora presenti avvisi del browser che il certificato non è attendibile. Il certificato di sviluppo HTTPS core ASP.NET viene usato da Kestrel.

Per ripristinare il certificato IIS Express, vedere questo problema di Stackoverflow .

Tutte le piattaforme : certificato non attendibile

Eseguire i comandi seguenti:

dotnet dev-certs https --clean
dotnet dev-certs https --trust

Chiudere tutte le istanze del browser aperte. Aprire una nuova finestra del browser per l'app. L'attendibilità del certificato viene memorizzata nella cache dai browser.

dotnet dev-certs https --clean ha esito negativo

I comandi precedenti risolveranno la maggior parte dei problemi di attendibilità del browser. Se il browser non considera attendibile il certificato, seguire i suggerimenti specifici della piattaforma che seguono.

Docker : certificato non attendibile

  • Eliminare la cartella C:\Users{USER}\AppData\Roaming\ASP.NET\Https .
  • Pulire la soluzione. Eliminare le cartelle bin e obj.
  • Riavviare lo strumento di sviluppo. Ad esempio, Visual Studio, Visual Studio Code o Visual Studio per Mac.

Windows - Certificato non attendibile

  • Controllare i certificati nell'archivio certificati. Deve essere presente un localhost certificato con il ASP.NET Core HTTPS development certificate nome amichevole sia in Current User > Personal > Certificates che Current User > Trusted root certification authorities > Certificates
  • Rimuovere tutti i certificati trovati dalle autorità di certificazione personali e dalle autorità di certificazione radice attendibili. Non rimuovere il certificato localhost di IIS Express.
  • Eseguire i comandi seguenti:
dotnet dev-certs https --clean
dotnet dev-certs https --trust

Chiudere tutte le istanze del browser aperte. Aprire una nuova finestra del browser per l'app. L'attendibilità del certificato viene memorizzata nella cache dai browser.

OS X - Certificato non attendibile

  • Aprire l'accesso KeyChain.
  • Selezionare il portachiavi di sistema.
  • Verificare la presenza di un certificato localhost.
  • Verificare che contenga un + simbolo sull'icona per indicare che è attendibile per tutti gli utenti.
  • Rimuovere il certificato dal portachiavi di sistema.
  • Eseguire i comandi seguenti:
dotnet dev-certs https --clean
dotnet dev-certs https --trust

Chiudere tutte le istanze del browser aperte. Aprire una nuova finestra del browser per l'app. L'attendibilità del certificato viene memorizzata nella cache dai browser.

Per la risoluzione dei problemi relativi ai certificati con Visual Studio, vedere Errore HTTPS con IIS Express (dotnet/AspNetCore #16892 ).

Certificato Linux non attendibile

Verificare che il certificato configurato per l'attendibilità sia il certificato per sviluppatore HTTPS utente che verrà usato dal Kestrel server.

Verifica il certificato per sviluppatore Kestrel HTTPS predefinito dell'utente corrente nel percorso seguente:

ls -la ~/.dotnet/corefx/cryptography/x509stores/my

Il file del certificato per sviluppatori Kestrel HTTPS è rappresentato dall'impronta digitale SHA1. Quando il file viene eliminato tramite dotnet dev-certs https --clean, viene rigenerato quando necessario con un'impronta digitale diversa. Verificare che l'impronta digitale del certificato esportato corrisponda all'impronta digitale ottenuta con il seguente comando:

openssl x509 -noout -fingerprint -sha1 -inform pem -in /usr/local/share/ca-certificates/aspnet/https.crt

Se il certificato non corrisponde, potrebbe essere uno dei seguenti:

  • Un certificato precedente.
  • È stato esportato un certificato per sviluppatore per l'utente root. In questo caso, esportare il certificato.

Il certificato root può essere controllato all'indirizzo:

ls -la /root/.dotnet/corefx/cryptography/x509stores/my

Certificato SSL di IIS Express usato con Visual Studio

Per risolvere i problemi relativi al certificato IIS Express, selezionare Ripristina dal programma di installazione di Visual Studio. Per altre informazioni, vedere questo problema in GitHub.

Informazioni aggiuntive

Nota

Se si usa .NET 9 SDK o versione successiva, vedere le procedure linux aggiornate nella versione .NET 9 di questo articolo.

Avviso

Progetti API

Non usare RequireHttpsAttribute sulle API Web che ricevono informazioni riservate. RequireHttpsAttribute usa i codici di stato HTTP per reindirizzare i browser da HTTP a HTTPS. I client API potrebbero non comprendere o obbedire ai reindirizzamenti da HTTP a HTTPS. Tali client possono inviare informazioni su HTTP. Le API Web devono:

  • Non è in ascolto su HTTP.
  • Chiudere la connessione con il codice di stato 400 (Richiesta non valida) e non gestire la richiesta.

Per disabilitare il reindirizzamento HTTP in un'API, impostare la ASPNETCORE_URLS variabile di ambiente o usare il flag della --urls riga di comando. Per altre informazioni, vedere Usare più ambienti in ASP.NET Core e 8 modi per impostare gli URL per un'app ASP.NET Core di Andrew Lock.

Progetti HSTS e API

I progetti API predefiniti non includono HSTS perché HSTS è in genere un'istruzione solo browser. Altri chiamanti, ad esempio le app per telefono o desktop, non obbediscono all'istruzione. Anche all'interno dei browser, una singola chiamata autenticata a un'API tramite HTTP presenta rischi per le reti non sicure. L'approccio sicuro consiste nel configurare i progetti API in modo che ascoltino e rispondano solo tramite HTTPS.

Il reindirizzamento HTTP a HTTPS causa ERR_INVALID_REDIRECT nella richiesta di preflight CORS.

Le richieste a un endpoint che usano HTTP e che vengono reindirizzate a HTTPS da UseHttpsRedirection falliscono a causa di ERR_INVALID_REDIRECT nella richiesta preliminare CORS.

I progetti API possono rifiutare le richieste HTTP anziché usarle UseHttpsRedirection per reindirizzare le richieste a HTTPS.

Richiedere HTTPS

Raccomandiamo che le applicazioni web ASP.NET Core di produzione usino:

  • Middleware di reindirizzamento HTTPS (UseHttpsRedirection) per reindirizzare le richieste HTTP a HTTPS.
  • Middleware HSTS (UseHsts) che invia intestazioni HTTP Strict Transport Security Protocol (HSTS) ai client.

Nota

Le app distribuite in una configurazione del proxy inverso consentono al proxy di gestire la sicurezza delle connessioni (HTTPS). Se il proxy gestisce anche il reindirizzamento HTTPS, non è necessario usare il middleware di reindirizzamento HTTPS. Se il server proxy gestisce anche la scrittura di intestazioni HSTS (ad esempio, il supporto HSTS nativo in IIS 10.0 (1709) o versione successiva, il middleware HSTS non è richiesto dall'app. Per ulteriori informazioni, vedere Disattivare HTTPS/HSTS durante la creazione del progetto.

UseHttpsRedirection

Nel file Program.cs viene chiamato il codice seguente UseHttpsRedirection:

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();

var app = builder.Build();

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();

Il codice evidenziato precedente:

È consigliabile usare reindirizzamenti temporanei anziché reindirizzamenti permanenti. La memorizzazione nella cache dei collegamenti può causare un comportamento instabile negli ambienti di sviluppo. Se si preferisce inviare un codice di stato di reindirizzamento permanente quando l'app si trova in un ambiente non di sviluppo, vedere la sezione Configurare reindirizzamenti permanenti nell'ambiente di produzione . È consigliabile usare HSTS per segnalare ai client che devono essere inviate solo richieste di risorse sicure all'app (solo in produzione).

Configurazione della porta

Una porta deve essere disponibile per il middleware per reindirizzare una richiesta non sicura a HTTPS. Se non è disponibile alcuna porta:

  • Il reindirizzamento a HTTPS non si verifica.
  • Il middleware registra l'avviso "Impossibile determinare la porta https per il reindirizzamento".

Specificare la porta HTTPS usando uno degli approcci seguenti:

  • Impostare HttpsRedirectionOptions.HttpsPort.

  • Impostare le impostazioni https_portdell'host:

    • Nella configurazione dell'host.

    • Impostando la ASPNETCORE_HTTPS_PORT variabile di ambiente.

    • Aggiungendo una voce di primo livello in appsettings.json:

      {
        "https_port": 443,
        "Logging": {
          "LogLevel": {
            "Default": "Information",
            "Microsoft.AspNetCore": "Warning"
          }
        },
        "AllowedHosts": "*"
      }
      
  • Indicare una porta con lo schema sicuro usando la variabile di ambiente ASPNETCORE_URLS. La variabile di ambiente configura il server. Il middleware individua indirettamente la porta HTTPS tramite IServerAddressesFeature. Questo approccio non funziona nelle implementazioni del proxy inverso.

  • I modelli Web ASP.NET Core impostano un URL HTTPS in Properties/launchsettings.json sia per Kestrel che per IIS Express. launchsettings.json viene usato solo nel computer locale.

  • Configurare un endpoint URL HTTPS per una distribuzione perimetrale pubblica del Kestrel server o HTTP.sys server. L'app usa una sola porta HTTPS. Il middleware individua la porta tramite IServerAddressesFeature.

Nota

Quando un'app viene eseguita in una configurazione del proxy inverso, IServerAddressesFeature non è disponibile. Impostare la porta usando uno degli altri approcci descritti in questa sezione.

Implementazioni Edge

Quando Kestrel o HTTP.sys viene usato come server perimetrale pubblico, Kestrel o HTTP.sys deve essere configurato per l'ascolto su entrambi:

  • Porta sicura in cui viene reindirizzato il client (in genere, 443 nell'ambiente di produzione e 5001 in fase di sviluppo).
  • Porta non sicura (in genere, 80 in ambiente di produzione e 5000 in fase di sviluppo).

La porta non sicura deve essere accessibile dal client per consentire all'app di ricevere una richiesta non sicura e reindirizzare il client alla porta protetta.

Per altre informazioni, vedere Kestrel configurazione dell'endpoint o l'implementazione del server web HTTP.sys in ASP.NET Core.

Scenari di distribuzione

Qualsiasi firewall tra il client e il server deve anche avere porte di comunicazione aperte per il traffico.

Se le richieste vengono inoltrate in una configurazione del proxy inverso, usare Middleware delle intestazioni inoltrate prima di chiamare il middleware di reindirizzamento HTTPS. Il middleware delle intestazioni inoltrate aggiorna Request.Scheme usando l'intestazione X-Forwarded-Proto. Il middleware consente il corretto funzionamento degli URI di reindirizzamento e di altri criteri di sicurezza. Quando il Middleware delle Intestazioni Inoltrate non viene usato, l'app back-end potrebbe non ricevere lo schema corretto e potrebbe finire in un ciclo di reindirizzamento. Un messaggio di errore comune dell'utente finale è che si sono verificati troppi reindirizzamenti.

Quando si esegue la distribuzione nel servizio app Azure, seguire le indicazioni riportate in Esercitazione: Associare un certificato SSL personalizzato esistente ad Azure App Web.

Opzioni

Il codice evidenziato seguente chiama AddHttpsRedirection per configurare le opzioni del middleware.

using static Microsoft.AspNetCore.Http.StatusCodes;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();

builder.Services.AddHsts(options =>
{
    options.Preload = true;
    options.IncludeSubDomains = true;
    options.MaxAge = TimeSpan.FromDays(60);
    options.ExcludedHosts.Add("example.com");
    options.ExcludedHosts.Add("www.example.com");
});

builder.Services.AddHttpsRedirection(options =>
{
    options.RedirectStatusCode = Status307TemporaryRedirect;
    options.HttpsPort = 5001;
});

var app = builder.Build();

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();

La chiamata AddHttpsRedirection è necessaria solo per modificare i valori di HttpsPort o RedirectStatusCode.

Il codice evidenziato precedente:

Configurare reindirizzamenti permanenti nell'ambiente di produzione

Il middleware usa per impostazione predefinita l'invio di un oggetto Status307TemporaryRedirect con tutti i reindirizzamenti. Se preferisci inviare un codice di stato di reindirizzamento permanente quando l'app si trova in un ambiente diverso da quello di sviluppo, incapsula la configurazione delle opzioni middleware in un controllo condizionale per un ambiente diverso da quello di sviluppo.

Quando si configurano i servizi in Program.cs:

using static Microsoft.AspNetCore.Http.StatusCodes;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();

if (!builder.Environment.IsDevelopment())
{
    builder.Services.AddHttpsRedirection(options =>
    {
        options.RedirectStatusCode = Status308PermanentRedirect;
        options.HttpsPort = 443;
    });
}

var app = builder.Build();

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");

    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();

Approccio alternativo al middleware di reindirizzamento HTTPS

Un'alternativa all'uso del middleware di reindirizzamento HTTPS (UseHttpsRedirection) consiste nell'usare il middleware di riscrittura URL (AddRedirectToHttps). AddRedirectToHttps può anche impostare il codice di stato e la porta quando viene eseguito il reindirizzamento. Per altre informazioni, vedere Middleware di riscrittura URL.

Quando si reindirizza a HTTPS senza il requisito di regole di reindirizzamento aggiuntive, è consigliabile usare il middleware di reindirizzamento HTTPS (UseHttpsRedirection) descritto in questo articolo.

HTTP Strict Transport Security Protocol (HSTS)

Per OWASP, HTTP Strict Transport Security (HSTS) è un miglioramento della sicurezza di consenso esplicito specificato da un'app Web tramite l'uso di un'intestazione di risposta. Quando un browser che supporta HSTS riceve questa intestazione:

  • Il browser archivia la configurazione per il dominio che impedisce l'invio di comunicazioni tramite HTTP. Il browser forza tutte le comunicazioni tramite HTTPS.
  • Il browser impedisce all'utente di usare certificati non attendibili o non validi. Il browser disabilita le richieste che consentono a un utente di considerare temporaneamente attendibile tale certificato.

Poiché HSTS viene applicato dal client, presenta alcune limitazioni:

  • Il client deve supportare HSTS.
  • HSTS richiede almeno una richiesta HTTPS riuscita per stabilire i criteri HSTS.
  • L'applicazione deve controllare ogni richiesta HTTP e reindirizzare o rifiutare la richiesta HTTP.

ASP.NET Core implementa HSTS con il UseHsts metodo di estensione. Il codice seguente chiama UseHsts quando l'app non è in modalità di sviluppo:

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();

var app = builder.Build();

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();

UseHsts non è consigliato in fase di sviluppo perché le impostazioni HSTS sono altamente memorizzabili nella cache dai browser. Per impostazione predefinita, UseHsts esclude l'indirizzo di loopback locale.

Per gli ambienti di produzione che implementano HTTPS per la prima volta, impostare l'oggetto iniziale HstsOptions.MaxAge su un valore ridotto usando uno dei metodi TimeSpan. Impostare il valore da ore a non più di un singolo giorno nel caso in cui sia necessario ripristinare l'infrastruttura HTTPS su HTTP. Dopo aver fiducia nella sostenibilità della configurazione HTTPS, aumentare il valore HSTS max-age ; un valore comunemente usato è un anno.

Il codice evidenziato seguente:

using static Microsoft.AspNetCore.Http.StatusCodes;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();

builder.Services.AddHsts(options =>
{
    options.Preload = true;
    options.IncludeSubDomains = true;
    options.MaxAge = TimeSpan.FromDays(60);
    options.ExcludedHosts.Add("example.com");
    options.ExcludedHosts.Add("www.example.com");
});

builder.Services.AddHttpsRedirection(options =>
{
    options.RedirectStatusCode = Status307TemporaryRedirect;
    options.HttpsPort = 5001;
});

var app = builder.Build();

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();
  • Imposta il parametro di precaricamento dell'intestazione Strict-Transport-Security . Il precaricamento non fa parte della specifica RFC HSTS, ma è supportato dai browser web per precaricare i siti HSTS in caso di nuova installazione. Per ulteriori informazioni, vedere https://hstspreload.org/.
  • Abilita includeSubDomain, che applica il criterio HSTS ai sottodomini host.
  • Imposta in modo esplicito il max-age parametro dell'intestazione Strict-Transport-Security su 60 giorni. Se non è impostato, il valore predefinito è 30 giorni. Per ulteriori informazioni, consultare la direttiva max-age.
  • Aggiunge example.com all'elenco di host da escludere.

UseHsts esclude gli host di loopback seguenti:

  • localhost : indirizzo di loopback IPv4.
  • 127.0.0.1 : l'indirizzo di loopback IPv4.
  • [::1] : l'indirizzo di loopback IPv6.

Rifiutare esplicitamente HTTPS/HSTS alla creazione del progetto

In alcuni scenari di servizio back-end in cui la sicurezza della connessione viene gestita nel perimetro pubblico della rete, la configurazione della sicurezza delle connessioni in ogni nodo non è necessaria. Le app Web generate dai modelli in Visual Studio o dal comando dotnet new abilitano il reindirizzamento HTTPS e HSTS. Per le distribuzioni che non richiedono questi scenari, è possibile rifiutare esplicitamente HTTPS/HSTS quando l'app viene creata dal modello.

Per rifiutare esplicitamente HTTPS/HSTS:

Deseleziona la casella di controllo Configura per HTTPS.

Nuova finestra di dialogo ASP.NET Core Web Application con la casella di controllo Configura per HTTPS deselezionata.

Considerare attendibile il certificato di sviluppo HTTPS di ASP.NET Core in Windows e macOS

Per il browser Firefox, vedere la sezione successiva.

.NET Core SDK include un certificato di sviluppo HTTPS. Il certificato viene installato come parte dell'esperienza di prima esecuzione. Ad esempio, dotnet --info produce una variante dell'output seguente:

ASP.NET Core
------------
Successfully installed the ASP.NET Core HTTPS Development Certificate.
To trust the certificate run 'dotnet dev-certs https --trust' (Windows and macOS only).
For establishing trust on other platforms refer to the platform specific documentation.
For more information on configuring HTTPS see https://go.microsoft.com/fwlink/?linkid=848054.

L'installazione di .NET Core SDK include l'installazione del certificato di sviluppo HTTPS ASP.NET Core nell'archivio certificati utente locale. Il certificato è stato installato, ma non è attendibile. Per considerare attendibile il certificato, completare una procedura una tantum per eseguire lo strumento dotnet dev-certs.

dotnet dev-certs https --trust

Il comando seguente fornisce aiuto sullo strumento dotnet dev-certs:

dotnet dev-certs https --help

Avviso

Non creare un certificato di sviluppo in un ambiente che verrà ridistribuito, ad esempio un'immagine del contenitore o una macchina virtuale. In questo modo si possono verificare lo spoofing e l'elevazione dei privilegi. Per evitare questo problema, impostare la DOTNET_GENERATE_ASPNET_CERTIFICATE variabile di ambiente su false prima di chiamare l'interfaccia della riga di comando di .NET per la prima volta. Questa operazione ignora la generazione automatica del certificato di sviluppo ASP.NET Core durante la prima esecuzione dell'interfaccia della riga di comando.

Fidarsi del certificato HTTPS in Firefox per evitare l'errore SEC_ERROR_INADEQUATE_KEY_USAGE

Il browser Firefox usa il proprio archivio certificati e pertanto non considera attendibili i certificati IIS Express o Kestrel developer.

Esistono due approcci per considerare attendibile il certificato HTTPS con Firefox, creare un file di criteri o configurarlo con il browser FireFox. La configurazione con il browser crea il file di criteri, quindi i due approcci sono equivalenti.

Creare un file di criteri per considerare attendibile il certificato HTTPS con Firefox

Creare un file di criteri (policies.json) in:

Aggiungere il codice JSON seguente al file dei criteri di Firefox:

{
  "policies": {
    "Certificates": {
      "ImportEnterpriseRoots": true
    }
  }
}

Il file di policy precedente fa sì che Firefox si fidi dei certificati presenti nell'archivio dei certificati attendibili di Windows. La sezione successiva fornisce un approccio alternativo per creare il file di criteri precedente usando il browser Firefox.

Configurare l'attendibilità del certificato HTTPS tramite il browser Firefox

Impostare security.enterprise_roots.enabled = true usando le istruzioni seguenti:

  1. Immettere about:config nel browser FireFox.
  2. Selezionare Accettare il rischio e continuare se si accetta il rischio.
  3. Selezionare Mostra tutto
  4. Impostare security.enterprise_roots.enabled = true
  5. Uscire e riavviare Firefox

Per altre informazioni, vedere Configurazione di autorità di certificazione (CA) in Firefox e il file mozilla/policy-templates/README.

Come configurare un certificato per sviluppatore per Docker

Vedere il problema in GitHub.

Considerare attendibile il certificato HTTPS in Linux

Stabilire l'attendibilità dipende dalla distribuzione ed è specifico per il browser. Le sezioni seguenti forniscono istruzioni per alcune distribuzioni popolari e i browser Chromium (Edge e Chrome) e per Firefox.

Ubuntu considera attendibile il certificato per la comunicazione da servizio a servizio

Le istruzioni seguenti non funzionano per alcune versioni di Ubuntu, ad esempio 20.04. Per altre informazioni, vedere Problema di GitHub dotnet/AspNetCore.Docs #23686.

  1. Installare OpenSSL 1.1.1h o versione successiva. Per istruzioni su come aggiornare OpenSSL, vedere la distribuzione.

  2. Eseguire i comandi seguenti:

    dotnet dev-certs https
    sudo -E dotnet dev-certs https -ep /usr/local/share/ca-certificates/aspnet/https.crt --format PEM
    sudo update-ca-certificates
    

I comandi precedenti:

  • Verificare che il certificato per sviluppatore dell'utente corrente sia stato creato.
  • Esporta il certificato con autorizzazioni elevate necessarie per la ca-certificates cartella, usando l'ambiente dell'utente corrente.
  • Rimuovendo il flag -E si esporta il certificato utente radice, generandolo se necessario. Ogni certificato appena generato ha un'impronta digitale diversa. Quando si esegue come root, sudo e -E non sono necessari.

Il percorso nel comando precedente è specifico per Ubuntu. Per altre distribuzioni, selezionare un percorso appropriato o usare il percorso per le autorità di certificazione (CA).

Considerare attendibile il certificato HTTPS in Linux usando Edge o Chrome

Per i browser Chromium su Linux:

  • Installare il libnss3-tools per distribuzione.

  • Creare o verificare che la $HOME/.pki/nssdb cartella esista nel computer.

  • Esportare il certificato con il comando seguente:

    dotnet dev-certs https
    sudo -E dotnet dev-certs https -ep /usr/local/share/ca-certificates/aspnet/https.crt --format PEM
    

    Il percorso nel comando precedente è specifico per Ubuntu. Per altre distribuzioni, selezionare un percorso appropriato o usare il percorso per le autorità di certificazione (CA).

  • Eseguire i comandi seguenti:

    certutil -d sql:$HOME/.pki/nssdb -A -t "P,," -n localhost -i /usr/local/share/ca-certificates/aspnet/https.crt
    
  • Uscire e riavviare il browser.

Considerare attendibile il certificato con Firefox in Linux

  • Esportare il certificato con il comando seguente:

    dotnet dev-certs https
    sudo -E dotnet dev-certs https -ep /usr/local/share/ca-certificates/aspnet/https.crt --format PEM
    

    Il percorso nel comando precedente è specifico per Ubuntu. Per altre distribuzioni, selezionare un percorso appropriato o usare il percorso per le autorità di certificazione (CA).

  • Creare un file JSON in /usr/lib/firefox/distribution/policies.json con il comando seguente:

cat <<EOF | sudo tee /usr/lib/firefox/distribution/policies.json
{
    "policies": {
        "Certificates": {
            "Install": [
                "/usr/local/share/ca-certificates/aspnet/https.crt"
            ]
        }
    }
}
EOF

Nota: Ubuntu 21.10 Firefox viene fornito come pacchetto snap e la cartella di installazione è /snap/firefox/current/usr/lib/firefox.

Vedere Configurare l'attendibilità del certificato HTTPS usando il browser Firefox in questo articolo per un modo alternativo per configurare il file di criteri usando il browser.

Considerare attendibile il certificato con Fedora 34

Vedere:

Considerare attendibile il certificato per altre distribuzioni

Vedere il problema in GitHub.

Rendere attendibile il certificato HTTPS dal sottosistema Windows per Linux

Le istruzioni seguenti non funzionano per alcune distribuzioni linux, ad esempio Ubuntu 20.04. Per altre informazioni, vedere Problema di GitHub dotnet/AspNetCore.Docs #23686.

Il sottosistema Windows per Linux (WSL) genera un certificato di sviluppo autofirmato HTTPS, che per impostazione predefinita non è attendibile in Windows. Il modo più semplice per considerare attendibile il certificato WSL di Windows consiste nel configurare WSL per l'uso dello stesso certificato di Windows:

  • In Windows esportare il certificato per sviluppatore in un file:

    dotnet dev-certs https -ep https.pfx -p $CREDENTIAL_PLACEHOLDER$ --trust
    

    Dove $CREDENTIAL_PLACEHOLDER$ è una password.

  • In una finestra WSL importare il certificato esportato nell'istanza WSL:

    dotnet dev-certs https --clean --import <<path-to-pfx>> --password $CREDENTIAL_PLACEHOLDER$
    

L'approccio precedente è valido una sola volta per ogni certificato e distribuzione WSL. È più semplice che esportare il certificato più volte. Se si aggiorna o si rigenera il certificato in Windows, potrebbe essere necessario eseguire di nuovo i comandi precedenti.

Risolvi i problemi relativi ai certificati, ad esempio il certificato non attendibile

Questa sezione fornisce informazioni utili quando il certificato di sviluppo HTTPS core ASP.NET è stato installato e attendibile, ma sono ancora presenti avvisi del browser che il certificato non è attendibile. Il certificato di sviluppo HTTPS core ASP.NET viene usato da Kestrel.

Per ripristinare il certificato IIS Express, vedere questo problema di Stackoverflow .

Tutte le piattaforme : certificato non attendibile

Eseguire i comandi seguenti:

dotnet dev-certs https --clean
dotnet dev-certs https --trust

Chiudere tutte le istanze del browser aperte. Aprire una nuova finestra del browser per l'app. L'attendibilità del certificato viene memorizzata nella cache dai browser.

dotnet dev-certs https --clean non riesce

I comandi precedenti risolveranno la maggior parte dei problemi di attendibilità del browser. Se il browser non considera attendibile il certificato, seguire i suggerimenti specifici della piattaforma che seguono.

Docker : certificato non attendibile

  • Eliminare la cartella C:\Users{USER}\AppData\Roaming\ASP.NET\Https .
  • Pulire la soluzione. Eliminare le cartelle bin e obj.
  • Riavviare lo strumento di sviluppo. Ad esempio, Visual Studio o Visual Studio Code.

Windows - Certificato non attendibile

  • Controllare i certificati nell'archivio certificati. Deve essere presente un localhost certificato con il ASP.NET Core HTTPS development certificate nome descrittivo sia sotto Current User > Personal > Certificates che sotto Current User > Trusted root certification authorities > Certificates
  • Rimuovere tutti i certificati trovati dalle autorità di certificazione personali e dalle autorità di certificazione radice attendibili. Non rimuovere il certificato localhost di IIS Express.
  • Eseguire i comandi seguenti:
dotnet dev-certs https --clean
dotnet dev-certs https --trust

Chiudere tutte le istanze del browser aperte. Aprire una nuova finestra del browser per l'app.

OS X - Certificato non attendibile

  • Apri Accesso KeyChain.
  • Selezionare il portachiavi di sistema.
  • Verificare la presenza di un certificato localhost.
  • Verificare che contenga un + simbolo sull'icona per indicare che è attendibile per tutti gli utenti.
  • Rimuovere il certificato dal portachiavi di sistema.
  • Eseguire i comandi seguenti:
dotnet dev-certs https --clean
dotnet dev-certs https --trust

Chiudere tutte le istanze del browser aperte. Aprire una nuova finestra del browser per l'app.

Per la risoluzione dei problemi relativi ai certificati con Visual Studio, vedere Errore HTTPS con IIS Express (dotnet/AspNetCore #16892 ).

Certificato Linux non attendibile

Verificare che il certificato configurato per l'attendibilità sia il certificato per sviluppatore HTTPS utente che verrà usato dal Kestrel server.

Controllare il certificato HTTPS per sviluppatori predefinito dell'utente corrente nella seguente posizione: Kestrel

ls -la ~/.dotnet/corefx/cryptography/x509stores/my

Il file del certificato per sviluppatori Kestrel HTTPS è l'impronta digitale SHA1. Quando il file viene eliminato tramite dotnet dev-certs https --clean, viene rigenerato se necessario con un'impronta digitale diversa. Verificare che l'impronta digitale del certificato esportato corrisponda utilizzando il comando seguente:

openssl x509 -noout -fingerprint -sha1 -inform pem -in /usr/local/share/ca-certificates/aspnet/https.crt

Se il certificato non corrisponde, potrebbe essere uno dei seguenti:

  • Un certificato precedente.
  • È stato esportato un certificato sviluppatore per l'utente root. In questo caso, esportare il certificato.

Il certificato del superutente può essere controllato all'indirizzo:

ls -la /root/.dotnet/corefx/cryptography/x509stores/my

Certificato SSL di IIS Express usato con Visual Studio

Per risolvere i problemi relativi al certificato IIS Express, selezionare Ripristina dal programma di installazione di Visual Studio. Per altre informazioni, vedere questo problema in GitHub.

I criteri di gruppo impediscono l'affidabilità dei certificati autofirmati

In alcuni casi, i criteri di gruppo potrebbero impedire l'attendibilità dei certificati autofirmati. Per altre informazioni, vedere questo problema in GitHub.

Informazioni aggiuntive

Nota

Se si usa .NET 9 SDK o versione successiva, vedere le procedure linux aggiornate nella versione .NET 9 di questo articolo.

Avviso

Progetti API

Non usare RequireHttpsAttribute sulle API Web che ricevono informazioni sensibili. RequireHttpsAttribute usa i codici di stato HTTP per reindirizzare i browser da HTTP a HTTPS. I client API potrebbero non comprendere o obbedire ai reindirizzamenti da HTTP a HTTPS. Tali client possono inviare informazioni su HTTP. Le API Web devono:

  • Non è in ascolto su HTTP.
  • Chiudere la connessione con il codice di stato 400 (Richiesta non valida) e non gestire la richiesta.

Per disabilitare il reindirizzamento HTTP in un'API, impostare la ASPNETCORE_URLS variabile di ambiente o usare il flag della --urls riga di comando. Per altre informazioni, vedere Usare più ambienti in ASP.NET Core e 8 modi per impostare gli URL per un'app ASP.NET Core di Andrew Lock.

Progetti HSTS e API

I progetti API predefiniti non includono HSTS perché HSTS è in genere un'istruzione solo browser. Altri chiamanti, ad esempio le app per telefono o desktop, non obbediscono all'istruzione. Anche all'interno dei browser, una singola chiamata autenticata a un'API tramite HTTP presenta rischi per le reti non sicure. L'approccio sicuro consiste nel configurare i progetti API in modo che ascoltino e rispondano solo tramite HTTPS.

Il reindirizzamento HTTP a HTTPS causa ERR_INVALID_REDIRECT nella richiesta preflight CORS

Le richieste a un endpoint che utilizzano HTTP, reindirizzate a HTTPS da UseHttpsRedirection, non riescono con ERR_INVALID_REDIRECT nella richiesta preliminare CORS.

I progetti API possono rifiutare le richieste HTTP anziché usarle UseHttpsRedirection per reindirizzare le richieste a HTTPS.

Richiedere HTTPS

Raccomandiamo di usare le applicazioni web ASP.NET Core in ambiente di produzione:

  • Middleware di reindirizzamento HTTPS (UseHttpsRedirection) per reindirizzare le richieste HTTP a HTTPS.
  • Middleware HSTS (UseHsts) per inviare intestazioni HTTP Strict Transport Security Protocol (HSTS) ai client.

Nota

Le app distribuite in una configurazione del proxy inverso consentono al proxy di gestire la sicurezza delle connessioni (HTTPS). Se il proxy gestisce anche il reindirizzamento HTTPS, non è necessario usare il middleware di reindirizzamento HTTPS. Se il server proxy gestisce anche la scrittura di intestazioni HSTS (ad esempio, il supporto HSTS nativo in IIS 10.0 (1709) o versione successiva, il middleware HSTS non è richiesto dall'app. Per ulteriori informazioni, vedere Disabilitare HTTPS/HSTS durante la creazione del progetto.

Utilizza reindirizzamento HTTPS (UseHttpsRedirection)

Il codice seguente chiama UseHttpsRedirection nel file Program.cs.

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();

var app = builder.Build();

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();

Il codice evidenziato precedente:

È consigliabile usare reindirizzamenti temporanei anziché reindirizzamenti permanenti. La memorizzazione nella cache dei collegamenti può causare un comportamento instabile negli ambienti di sviluppo. Se si preferisce inviare un codice di stato di reindirizzamento permanente quando l'app si trova in un ambiente non di sviluppo, vedere la sezione Configurare reindirizzamenti permanenti nell'ambiente di produzione . È consigliabile usare HSTS per segnalare ai client che devono essere inviate solo richieste di risorse sicure all'app (solo in produzione).

Configurazione della porta

Una porta deve essere disponibile per il middleware per reindirizzare una richiesta non sicura a HTTPS. Se non è disponibile alcuna porta:

  • Il reindirizzamento a HTTPS non si verifica.
  • Il middleware registra l'avviso "Impossibile determinare la porta https per il reindirizzamento".

Specificare la porta HTTPS usando uno degli approcci seguenti:

  • Imposta HttpsRedirectionOptions.HttpsPort.

  • Impostare l'impostazione https_porthost:

    • Nella configurazione dell'host.

    • Impostando la ASPNETCORE_HTTPS_PORT variabile di ambiente.

    • Aggiungendo una voce di primo livello in appsettings.json:

      {
        "https_port": 443,
        "Logging": {
          "LogLevel": {
            "Default": "Information",
            "Microsoft.AspNetCore": "Warning"
          }
        },
        "AllowedHosts": "*"
      }
      
  • Indicare una porta con lo schema sicuro usando la variabile di ambiente ASPNETCORE_URLS. La variabile di ambiente configura il server. Il middleware individua indirettamente la porta HTTPS tramite IServerAddressesFeature. Questo approccio non funziona nelle distribuzioni di proxy inverso.

  • I modelli web ASP.NET Core impostano un URL HTTPS in Properties/launchsettings.json sia per Kestrel che per IIS Express. launchsettings.json viene usato solo nel computer locale.

  • Configurare un endpoint URL HTTPS per una distribuzione perimetrale pubblica del Kestrel server o HTTP.sys server. L'app usa una sola porta HTTPS. Il middleware individua la porta tramite IServerAddressesFeature.

Nota

Quando un'app viene eseguita in una configurazione del proxy inverso, IServerAddressesFeature non è disponibile. Impostare la porta usando uno degli altri approcci descritti in questa sezione.

Distribuzioni Edge

Quando Kestrel o HTTP.sys viene utilizzato come server di frontiera rivolto al pubblico, Kestrel o HTTP.sys deve essere configurato per ascoltare su entrambi:

  • Porta sicura in cui viene reindirizzato il client (in genere, 443 nell'ambiente di produzione e 5001 in fase di sviluppo).
  • La porta insicura (in genere, la 80 in produzione e la 5000 in fase di sviluppo).

La porta non sicura deve essere accessibile dal client per consentire all'app di ricevere una richiesta non sicura e reindirizzare il client alla porta protetta.

Per ulteriori informazioni, vedere la configurazione dell'endpoint o l'implementazione del server web HTTP.sys in ASP.NET Core.

Scenari di distribuzione

Qualsiasi firewall tra il client e il server deve anche avere porte di comunicazione aperte per il traffico.

Se le richieste vengono inoltrate in una configurazione di proxy inverso, utilizzare Middleware delle intestazioni inoltrate prima di chiamare il Middleware di reindirizzamento HTTPS. Il middleware delle intestazioni inoltrate aggiorna il Request.Scheme usando l'intestazione X-Forwarded-Proto. Il middleware consente il corretto funzionamento degli URI di reindirizzamento e di altri criteri di sicurezza. Quando il Middleware per le intestazioni inoltrate non viene usato, l'applicazione back-end potrebbe non ricevere lo schema corretto e finire in un ciclo di reindirizzamento. Un messaggio di errore comune dell'utente finale è che si sono verificati troppi reindirizzamenti.

Quando si esegue la distribuzione nel servizio app Azure, seguire le indicazioni riportate in Esercitazione: Associare un certificato SSL personalizzato esistente ad Azure App Web.

Opzioni

Le chiamate AddHttpsRedirection di codice evidenziate seguenti per configurare le opzioni del middleware:

using static Microsoft.AspNetCore.Http.StatusCodes;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();

builder.Services.AddHsts(options =>
{
    options.Preload = true;
    options.IncludeSubDomains = true;
    options.MaxAge = TimeSpan.FromDays(60);
    options.ExcludedHosts.Add("example.com");
    options.ExcludedHosts.Add("www.example.com");
});

builder.Services.AddHttpsRedirection(options =>
{
    options.RedirectStatusCode = Status307TemporaryRedirect;
    options.HttpsPort = 5001;
});

var app = builder.Build();

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();

La chiamata AddHttpsRedirection è necessaria solo per modificare i valori di HttpsPort o RedirectStatusCode.

Il codice evidenziato precedente:

Configurare reindirizzamenti permanenti nell'ambiente di produzione

Il middleware usa per impostazione predefinita l'invio di un oggetto Status307TemporaryRedirect con tutti i reindirizzamenti. Se si preferisce inviare un codice di stato di reindirizzamento permanente quando l'app si trova in un ambiente non di sviluppo, inserire la configurazione delle opzioni middleware in un controllo condizionale sull'ambiente non di sviluppo.

Quando si configurano i servizi in Program.cs:

using static Microsoft.AspNetCore.Http.StatusCodes;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();

if (!builder.Environment.IsDevelopment())
{
    builder.Services.AddHttpsRedirection(options =>
    {
        options.RedirectStatusCode = Status308PermanentRedirect;
        options.HttpsPort = 443;
    });
}

var app = builder.Build();

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");

    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();

Approccio alternativo al middleware di reindirizzamento HTTPS

Un'alternativa all'uso del middleware di reindirizzamento HTTPS (UseHttpsRedirection) consiste nell'usare il middleware di riscrittura URL (AddRedirectToHttps). AddRedirectToHttps può anche impostare il codice di stato e la porta quando viene eseguito il reindirizzamento. Per ulteriori informazioni, vedere la middleware di riscrittura URL.

Quando si reindirizza a HTTPS senza il requisito di regole di reindirizzamento aggiuntive, è consigliabile usare il middleware di reindirizzamento HTTPS (UseHttpsRedirection) descritto in questo articolo.

HTTP Strict Transport Security Protocol (HSTS)

Per OWASP, HTTP Strict Transport Security (HSTS) è un miglioramento della sicurezza di consenso esplicito specificato da un'app Web tramite l'uso di un'intestazione di risposta. Quando un browser che supporta HSTS riceve questa intestazione:

  • Il browser archivia la configurazione per il dominio che impedisce l'invio di comunicazioni tramite HTTP. Il browser forza tutte le comunicazioni tramite HTTPS.
  • Il browser impedisce all'utente di usare certificati non attendibili o non validi. Il browser disabilita le richieste che consentono a un utente di considerare temporaneamente attendibile tale certificato.

Poiché HSTS viene applicato dal client, presenta alcune limitazioni:

  • Il client deve supportare HSTS.
  • HSTS richiede almeno una richiesta HTTPS riuscita per stabilire i criteri HSTS.
  • L'applicazione deve controllare ogni richiesta HTTP e reindirizzare o rifiutare la richiesta HTTP.

ASP.NET Core implementa HSTS con il UseHsts metodo di estensione. Il codice seguente chiama UseHsts quando l'app non è in modalità di sviluppo:

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();

var app = builder.Build();

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();

UseHsts non è consigliato in fase di sviluppo perché le impostazioni HSTS sono altamente memorizzabili nella cache dai browser. Per impostazione predefinita, UseHsts esclude l'indirizzo di loopback locale.

Per gli ambienti di produzione che implementano HTTPS per la prima volta, impostare il valore iniziale HstsOptions.MaxAge a un valore ridotto utilizzando uno dei metodi TimeSpan. Impostare il valore da ore a non più di un singolo giorno nel caso in cui sia necessario ripristinare l'infrastruttura HTTPS su HTTP. Dopo aver fiducia nella sostenibilità della configurazione HTTPS, aumentare il valore HSTS max-age ; un valore comunemente usato è un anno.

Il codice evidenziato seguente:

using static Microsoft.AspNetCore.Http.StatusCodes;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();

builder.Services.AddHsts(options =>
{
    options.Preload = true;
    options.IncludeSubDomains = true;
    options.MaxAge = TimeSpan.FromDays(60);
    options.ExcludedHosts.Add("example.com");
    options.ExcludedHosts.Add("www.example.com");
});

builder.Services.AddHttpsRedirection(options =>
{
    options.RedirectStatusCode = Status307TemporaryRedirect;
    options.HttpsPort = 5001;
});

var app = builder.Build();

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();
  • Imposta il parametro di precaricamento dell'intestazione Strict-Transport-Security . Il precaricamento non fa parte della specifica RFC HSTS, ma è supportato dai browser web per precaricare i siti HSTS all'installazione fresca. Per ulteriori informazioni, vedere https://hstspreload.org/.
  • Abilita includeSubDomain, che applica il criterio HSTS ai sottodomini host.
  • Imposta in modo esplicito il max-age parametro dell'intestazione Strict-Transport-Security su 60 giorni. Se non è impostato, il valore predefinito è 30 giorni. Per ulteriori informazioni, vedere la direttiva max-age.
  • Aggiunge example.com all'elenco di host da escludere.

UseHsts esclude gli host di loopback seguenti:

  • localhost : indirizzo di loopback IPv4.
  • 127.0.0.1 : indirizzo di loopback IPv4.
  • [::1] : L'indirizzo di loopback IPv6.

Rifiutare esplicitamente HTTPS/HSTS alla creazione del progetto

In alcuni scenari di servizio back-end in cui la sicurezza della connessione viene gestita nel perimetro pubblico della rete, la configurazione della sicurezza delle connessioni in ogni nodo non è necessaria. Le app Web generate dai modelli in Visual Studio o dal comando dotnet new abilitano il reindirizzamento HTTPS e HSTS. Per le distribuzioni che non richiedono questi scenari, è possibile rifiutare esplicitamente HTTPS/HSTS quando l'app viene creata dal modello.

Per rifiutare esplicitamente HTTPS/HSTS:

Deselezionare l'opzione Configura per HTTPS.

Nuova finestra di dialogo ASP.NET Core Web Application con la casella di controllo Configura per HTTPS deselezionata.

Considerare attendibile il certificato di sviluppo HTTPS di ASP.NET Core in Windows e macOS

Per il browser Firefox, vedere la sezione successiva.

.NET Core SDK include un certificato di sviluppo HTTPS. Il certificato viene installato come parte dell'esperienza di prima esecuzione. Ad esempio, dotnet --info produce una variante dell'output seguente:

ASP.NET Core
------------
Successfully installed the ASP.NET Core HTTPS Development Certificate.
To trust the certificate run 'dotnet dev-certs https --trust' (Windows and macOS only).
For establishing trust on other platforms refer to the platform specific documentation.
For more information on configuring HTTPS see https://go.microsoft.com/fwlink/?linkid=848054.

L'installazione di .NET Core SDK include l'installazione del certificato di sviluppo HTTPS ASP.NET Core nell'archivio certificati utente locale. Il certificato è stato installato, ma non è attendibile. Per considerare attendibile il certificato, eseguire il passaggio una tantum per eseguire lo strumento dotnet dev-certs.

dotnet dev-certs https --trust

Il comando seguente fornisce informazioni sull'aiuto dello strumento dotnet dev-certs:

dotnet dev-certs https --help

Avviso

Non creare un certificato di sviluppo in un ambiente che verrà ridistribuito, ad esempio un'immagine del contenitore o una macchina virtuale. Agendo in questo modo, si può incorrere in rischi di spoofing e un'elevazione dei privilegi. Per evitare questo problema, impostare la DOTNET_GENERATE_ASPNET_CERTIFICATE variabile di ambiente su false prima di chiamare l'interfaccia della riga di comando di .NET per la prima volta. Questa operazione ignora la generazione automatica del certificato di sviluppo ASP.NET Core durante la prima esecuzione dell'interfaccia della riga di comando.

Rendere attendibile il certificato HTTPS con Firefox per evitare l'errore SEC_ERROR_INADEQUATE_KEY_USAGE

Il browser Firefox usa il proprio archivio certificati e pertanto non considera attendibili i certificati IIS Express o Kestrel developer.

Esistono due approcci per considerare attendibile il certificato HTTPS con Firefox, creare un file di criteri o configurarlo con il browser FireFox. La configurazione con il browser crea il file di criteri, quindi i due approcci sono equivalenti.

Creare un file di criteri per considerare attendibile il certificato HTTPS con Firefox

Creare un file di policy (policies.json) in:

Aggiungere il codice JSON seguente al file dei criteri di Firefox:

{
  "policies": {
    "Certificates": {
      "ImportEnterpriseRoots": true
    }
  }
}

Il file delle policy precedente fa sì che Firefox consideri fidati i certificati dai certificati attendibili presenti nell'archivio certificati di Windows. La sezione successiva fornisce un approccio alternativo per creare il file di criteri precedente usando il browser Firefox.

Configurare l'attendibilità del certificato HTTPS tramite il browser Firefox

Impostare security.enterprise_roots.enabled = true usando le istruzioni seguenti:

  1. Immettere about:config nel browser FireFox.
  2. Selezionare Accettare il rischio e continuare se si accetta il rischio.
  3. Selezionare Mostra tutto
  4. Impostare security.enterprise_roots.enabled = true
  5. Uscire e riavviare Firefox

Per altre informazioni, vedere Configurazione di autorità di certificazione (CA) in Firefox e il file mozilla/policy-templates/README.

Come configurare un certificato per sviluppatore per Docker

Vedere il problema in GitHub.

Considerare attendibile il certificato HTTPS in Linux

Stabilire l'attendibilità è specifico alla distribuzione e al browser. Le sezioni seguenti forniscono istruzioni per alcune distribuzioni popolari e i browser Chromium (Edge e Chrome) e per Firefox.

Autorizzare il certificato HTTPS su Linux con linux-dev-certs

linux-dev-certs è uno strumento globale .NET open source supportato dalla community che offre un modo pratico per creare e considerare attendibile un certificato per sviluppatori in Linux. Lo strumento non è gestito o supportato da Microsoft.

I comandi seguenti installano lo strumento e creano un certificato per sviluppatori attendibile:

dotnet tool update -g linux-dev-certs
dotnet linux-dev-certs install

Per ulteriori informazioni o per segnalare eventuali problemi, vedere il repository GitHub linux-dev-certs.

Ubuntu considera attendibile il certificato per la comunicazione da servizio a servizio

Le istruzioni seguenti non funzionano per alcune versioni di Ubuntu, ad esempio 20.04. Per altre informazioni, vedere Problema di GitHub dotnet/AspNetCore.Docs #23686.

  1. Installare OpenSSL 1.1.1h o versione successiva. Per istruzioni su come aggiornare OpenSSL, vedere la distribuzione.

  2. Eseguire i comandi seguenti:

    dotnet dev-certs https
    sudo -E dotnet dev-certs https -ep /usr/local/share/ca-certificates/aspnet/https.crt --format PEM
    sudo update-ca-certificates
    

I comandi precedenti:

  • Verificare che il certificato per sviluppatore dell'utente corrente sia stato creato.
  • Esporta il certificato con autorizzazioni elevate necessarie per la ca-certificates cartella, usando l'ambiente dell'utente corrente.
  • La rimozione del -E flag esporta il certificato utente radice, generandolo se necessario. Ogni nuovo certificato generato ha un'impronta digitale diversa. Quando si esegue come root, sudo e -E non sono necessari.

Il percorso nel comando precedente è specifico per Ubuntu. Per altre distribuzioni, selezionare un percorso appropriato o usare il percorso per le autorità di certificazione (CA).

Considerare attendibile il certificato HTTPS in Linux usando Edge o Chrome

Per i browser Chromium su Linux:

  • Installa il libnss3-tools per la tua distribuzione.

  • Creare o verificare che la $HOME/.pki/nssdb cartella esista nel computer.

  • Esportare il certificato con il comando seguente:

    dotnet dev-certs https
    sudo -E dotnet dev-certs https -ep /usr/local/share/ca-certificates/aspnet/https.crt --format PEM
    

    Il percorso nel comando precedente è specifico per Ubuntu. Per altre distribuzioni, selezionare un percorso appropriato o usare il percorso per le autorità di certificazione (CA).

  • Eseguire i comandi seguenti:

    certutil -d sql:$HOME/.pki/nssdb -A -t "P,," -n localhost -i /usr/local/share/ca-certificates/aspnet/https.crt
    
  • Uscire e riavviare il browser.

Considerare attendibile il certificato con Firefox in Linux

  • Esportare il certificato con il comando seguente:

    dotnet dev-certs https
    sudo -E dotnet dev-certs https -ep /usr/local/share/ca-certificates/aspnet/https.crt --format PEM
    

    Il percorso nel comando precedente è specifico per Ubuntu. Per altre distribuzioni, selezionare un percorso appropriato o usare il percorso per le autorità di certificazione (CA).

  • Creare un file JSON in /usr/lib/firefox/distribution/policies.json con il comando seguente:

cat <<EOF | sudo tee /usr/lib/firefox/distribution/policies.json
{
    "policies": {
        "Certificates": {
            "Install": [
                "/usr/local/share/ca-certificates/aspnet/https.crt"
            ]
        }
    }
}
EOF

Nota: Ubuntu 21.10 Firefox viene fornito come pacchetto snap e la cartella di installazione è /snap/firefox/current/usr/lib/firefox.

Vedere Configurare l'attendibilità del certificato HTTPS usando il browser Firefox in questo articolo per un modo alternativo per configurare il file di criteri usando il browser.

Considerare attendibile il certificato con Fedora 34

Vedere:

Considerare attendibile il certificato con altre distribuzioni

Vedere il problema in GitHub.

Considerare attendibile il certificato HTTPS del Sottosistema Windows per Linux

Le istruzioni seguenti non funzionano per alcune distribuzioni linux, ad esempio Ubuntu 20.04. Per altre informazioni, vedere Problema di GitHub dotnet/AspNetCore.Docs #23686.

Il sottosistema Windows per Linux (WSL) genera un certificato di sviluppo autofirmato HTTPS, che per impostazione predefinita non è attendibile in Windows. Il modo più semplice per considerare attendibile il certificato WSL di Windows consiste nel configurare WSL per l'uso dello stesso certificato di Windows:

  • In Windows esportare il certificato per sviluppatore in un file:

    dotnet dev-certs https -ep https.pfx -p $CREDENTIAL_PLACEHOLDER$ --trust
    

    Dove $CREDENTIAL_PLACEHOLDER$ è una password.

  • In una finestra WSL importare il certificato esportato nell'istanza WSL:

    dotnet dev-certs https --clean --import <<path-to-pfx>> --password $CREDENTIAL_PLACEHOLDER$
    

L'approccio precedente è un'operazione una tantum per ciascun certificato e per ciascuna distribuzione WSL. È più semplice che esportare il certificato più volte. Se si aggiorna o si rigenera il certificato in Windows, potrebbe essere necessario eseguire di nuovo i comandi precedenti.

Risolvi i problemi relativi ai certificati, ad esempio il certificato non attendibile

Questa sezione fornisce informazioni utili quando il certificato di sviluppo HTTPS core ASP.NET è stato installato e attendibile, ma sono ancora presenti avvisi del browser che il certificato non è attendibile. Il certificato di sviluppo HTTPS core ASP.NET viene usato da Kestrel.

Per ripristinare il certificato IIS Express, vedere questo problema di Stackoverflow .

Tutte le piattaforme : certificato non attendibile

Eseguire i comandi seguenti:

dotnet dev-certs https --clean
dotnet dev-certs https --trust

Chiudere tutte le istanze del browser aperte. Aprire una nuova finestra del browser per l'app. L'attendibilità del certificato viene memorizzata nella cache dai browser.

dotnet dev-certs https --clean non riesce

I comandi precedenti risolveranno la maggior parte dei problemi di attendibilità del browser. Se il browser non considera attendibile il certificato, seguire i suggerimenti specifici della piattaforma che seguono.

Docker : certificato non attendibile

  • Eliminare la cartella C:\Users{USER}\AppData\Roaming\ASP.NET\Https .
  • Pulire la soluzione. Eliminare le cartelle bin e obj.
  • Riavviare lo strumento di sviluppo. Ad esempio, Visual Studio o Visual Studio Code.

Windows - Certificato non attendibile

  • Controllare i certificati nell'archivio certificati. Deve essere presente un localhost certificato con il ASP.NET Core HTTPS development certificate nome descrittivo sia in Current User > Personal > Certificates che Current User > Trusted root certification authorities > Certificates
  • Rimuovere tutti i certificati trovati dalle autorità di certificazione radice personali e attendibili. Non rimuovere il certificato localhost di IIS Express.
  • Eseguire i comandi seguenti:
dotnet dev-certs https --clean
dotnet dev-certs https --trust

Chiudere tutte le istanze del browser aperte. Aprire una nuova finestra del browser per l'app.

OS X - Certificato non attendibile

  • Apri Keychain Access.
  • Selezionare il portachiavi di sistema.
  • Verificare la presenza di un certificato localhost.
  • Verificare che contenga un + simbolo sull'icona per indicare che è attendibile per tutti gli utenti.
  • Rimuovere il certificato dal portachiavi di sistema.
  • Eseguire i comandi seguenti:
dotnet dev-certs https --clean
dotnet dev-certs https --trust

Chiudere tutte le istanze del browser aperte. Aprire una nuova finestra del browser per l'app.

Per la risoluzione dei problemi relativi ai certificati con Visual Studio, vedere Errore HTTPS con IIS Express (dotnet/AspNetCore #16892 ).

Certificato Linux non attendibile

Verificare che il certificato configurato per l'attendibilità sia il certificato per sviluppatore HTTPS utente che verrà usato dal Kestrel server.

Controllare il certificato sviluppatore HTTPS predefinito dell'utente corrente alla seguente posizione:

ls -la ~/.dotnet/corefx/cryptography/x509stores/my

Il file del certificato per sviluppatori Kestrel HTTPS è l'impronta digitale SHA1. Quando il file viene eliminato tramite dotnet dev-certs https --clean, viene rigenerato, quando necessario, con un'impronta digitale diversa. Verificare che l'impronta digitale del certificato esportato corrisponda al comando seguente:

openssl x509 -noout -fingerprint -sha1 -inform pem -in /usr/local/share/ca-certificates/aspnet/https.crt

Se il certificato non corrisponde, potrebbe essere uno dei seguenti:

  • Un certificato precedente.
  • È stato esportato un certificato sviluppatore per l'utente root. In questo caso, esportare il certificato.

Il certificato root dell'utente può essere controllato all'indirizzo:

ls -la /root/.dotnet/corefx/cryptography/x509stores/my

Certificato SSL di IIS Express usato con Visual Studio

Per risolvere i problemi relativi al certificato IIS Express, selezionare Ripristina dal programma di installazione di Visual Studio. Per altre informazioni, vedere questo problema in GitHub.

Criteri di gruppo impediscono di considerare attendibili i certificati autofirmati

In alcuni casi, i criteri di gruppo potrebbero impedire l'attendibilità dei certificati autofirmati. Per altre informazioni, vedere questo problema in GitHub.

Informazioni aggiuntive