Aplicación de HTTPS en ASP.NET CoreEnforce HTTPS in ASP.NET Core

Por Rick AndersonBy Rick Anderson

En este documento se muestra cómo:This document shows how to:

  • Requiere HTTPS para todas las solicitudes.Require HTTPS for all requests.
  • Redirija todas las solicitudes HTTP a HTTPS.Redirect all HTTP requests to HTTPS.

Ninguna API puede impedir que un cliente envíe datos confidenciales en la primera solicitud.No API can prevent a client from sending sensitive data on the first request.

Advertencia

Proyectos de APIAPI projects

No use RequireHttpsAttribute en las API Web que reciben información confidencial.Do not use RequireHttpsAttribute on Web APIs that receive sensitive information. RequireHttpsAttribute usa códigos de Estado HTTP para redirigir exploradores de HTTP a HTTPS.RequireHttpsAttribute uses HTTP status codes to redirect browsers from HTTP to HTTPS. Es posible que los clientes de API no conozcan o cumplan las redirecciones de HTTP a HTTPS.API clients may not understand or obey redirects from HTTP to HTTPS. Estos clientes pueden enviar información a través de HTTP.Such clients may send information over HTTP. Las API Web deben:Web APIs should either:

  • No escuche en HTTP.Not listen on HTTP.
  • Cierre la conexión con el código de estado 400 (solicitud incorrecta) y no atienda la solicitud.Close the connection with status code 400 (Bad Request) and not serve the request.

Proyectos de HSTS y APIHSTS and API projects

Los proyectos de API predeterminados no incluyen HSTS porque HSTS suele ser una instrucción solo del explorador.The default API projects don't include HSTS because HSTS is generally a browser only instruction. Otros llamadores, como las aplicaciones de escritorio o de teléfono, no obedecen a la instrucción.Other callers, such as phone or desktop apps, do not obey the instruction. Incluso dentro de los exploradores, una única llamada autenticada a una API sobre HTTP tiene riesgos en las redes no seguras.Even within browsers, a single authenticated call to an API over HTTP has risks on insecure networks. El enfoque seguro consiste en configurar proyectos de API para que solo escuchen y respondan a través de HTTPS.The secure approach is to configure API projects to only listen to and respond over HTTPS.

Advertencia

Proyectos de APIAPI projects

No use RequireHttpsAttribute en las API Web que reciben información confidencial.Do not use RequireHttpsAttribute on Web APIs that receive sensitive information. RequireHttpsAttribute usa códigos de Estado HTTP para redirigir exploradores de HTTP a HTTPS.RequireHttpsAttribute uses HTTP status codes to redirect browsers from HTTP to HTTPS. Es posible que los clientes de API no conozcan o cumplan las redirecciones de HTTP a HTTPS.API clients may not understand or obey redirects from HTTP to HTTPS. Estos clientes pueden enviar información a través de HTTP.Such clients may send information over HTTP. Las API Web deben:Web APIs should either:

  • No escuche en HTTP.Not listen on HTTP.
  • Cierre la conexión con el código de estado 400 (solicitud incorrecta) y no atienda la solicitud.Close the connection with status code 400 (Bad Request) and not serve the request.

Requerir HTTPSRequire HTTPS

Se recomienda que las aplicaciones Web de producción ASP.NET Core usen:We recommend that production ASP.NET Core web apps use:

  • Middleware de redirección de HTTPS (UseHttpsRedirection) para redirigir las solicitudes HTTP a HTTPS.HTTPS Redirection Middleware (UseHttpsRedirection) to redirect HTTP requests to HTTPS.
  • Middleware de HSTS (UseHsts) para enviar encabezados del Protocolo de seguridad de transporte estricto (HSTS) http a los clientes.HSTS Middleware (UseHsts) to send HTTP Strict Transport Security Protocol (HSTS) headers to clients.

Nota

Las aplicaciones implementadas en una configuración de proxy inverso permiten que el proxy controle la seguridad de conexión (HTTPS).Apps deployed in a reverse proxy configuration allow the proxy to handle connection security (HTTPS). Si el proxy también controla el redireccionamiento de HTTPS, no es necesario usar el middleware de redirección de HTTPS.If the proxy also handles HTTPS redirection, there's no need to use HTTPS Redirection Middleware. Si el servidor proxy también controla la escritura de encabezados HSTS (por ejemplo, la compatibilidad con HSTS nativa en IIS 10,0 (1709) o posterior), la aplicación no requiere el middleware HSTS.If the proxy server also handles writing HSTS headers (for example, native HSTS support in IIS 10.0 (1709) or later), HSTS Middleware isn't required by the app. Para obtener más información, consulte no participar en https/HSTS en la creación de proyectos.For more information, see Opt-out of HTTPS/HSTS on project creation.

UseHttpsRedirectionUseHttpsRedirection

En el código siguiente se llama a UseHttpsRedirection en la clase Startup:The following code calls UseHttpsRedirection in the Startup class:

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();
    });
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseExceptionHandler("/Error");
        app.UseHsts();
    }

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

    app.UseMvc();
}

Código resaltado anterior:The preceding highlighted code:

Se recomienda el uso de redirecciones temporales en lugar de redireccionamientos permanentes.We recommend using temporary redirects rather than permanent redirects. El almacenamiento en caché de vínculos puede producir un comportamiento inestable en entornos de desarrollo.Link caching can cause unstable behavior in development environments. Si prefiere enviar un código de estado de redirección permanente cuando la aplicación se encuentra en un entorno que no es de desarrollo, consulte la sección configuración de redirecciones permanentes en producción .If you prefer to send a permanent redirect status code when the app is in a non-Development environment, see the Configure permanent redirects in production section. Se recomienda usar HSTS para indicar a los clientes que solo se deben enviar solicitudes de recursos seguros a la aplicación (solo en producción).We recommend using HSTS to signal to clients that only secure resource requests should be sent to the app (only in production).

Configuración de puertoPort configuration

Un puerto debe estar disponible para que el middleware redirija una solicitud no segura a HTTPS.A port must be available for the middleware to redirect an insecure request to HTTPS. Si no hay ningún puerto disponible:If no port is available:

  • No se produce la redirección a HTTPS.Redirection to HTTPS doesn't occur.
  • El middleware registra la advertencia "no se pudo determinar el puerto https para la redirección".The middleware logs the warning "Failed to determine the https port for redirect."

Especifique el Puerto HTTPS mediante cualquiera de los métodos siguientes:Specify the HTTPS port using any of the following approaches:

  • Establezca la configuración de hostde https_port:Set the https_port host setting:

    • En configuración de host.In host configuration.

    • Estableciendo el ASPNETCORE_HTTPS_PORT variable de entorno.By setting the ASPNETCORE_HTTPS_PORT environment variable.

    • Agregando una entrada de nivel superior en appSettings. JSON:By adding a top-level entry in appsettings.json:

      {
          "https_port": 443,
          "Logging": {
              "LogLevel": {
                  "Default": "Information",
                  "Microsoft": "Warning",
                  "Microsoft.Hosting.Lifetime": "Information"
              }
          },
          "AllowedHosts": "*"
      }
      
  • Indique un puerto con el esquema seguro mediante la variable de entorno ASPNETCORE_URLS.Indicate a port with the secure scheme using the ASPNETCORE_URLS environment variable. La variable de entorno configura el servidor.The environment variable configures the server. El middleware detecta indirectamente el Puerto HTTPS a través de IServerAddressesFeature.The middleware indirectly discovers the HTTPS port via IServerAddressesFeature. Este enfoque no funciona en las implementaciones de proxy inverso.This approach doesn't work in reverse proxy deployments.

  • Establezca la configuración de hostde https_port:Set the https_port host setting:

    • En configuración de host.In host configuration.

    • Estableciendo el ASPNETCORE_HTTPS_PORT variable de entorno.By setting the ASPNETCORE_HTTPS_PORT environment variable.

    • Agregando una entrada de nivel superior en appSettings. JSON:By adding a top-level entry in appsettings.json:

      {
          "https_port": 443,
          "Logging": {
              "LogLevel": {
                  "Default": "Warning"
              }
          },
          "AllowedHosts": "*"
      }
      
  • Indique un puerto con el esquema seguro mediante la variable de entorno ASPNETCORE_URLS.Indicate a port with the secure scheme using the ASPNETCORE_URLS environment variable. La variable de entorno configura el servidor.The environment variable configures the server. El middleware detecta indirectamente el Puerto HTTPS a través de IServerAddressesFeature.The middleware indirectly discovers the HTTPS port via IServerAddressesFeature. Este enfoque no funciona en las implementaciones de proxy inverso.This approach doesn't work in reverse proxy deployments.

  • En desarrollo, establezca una dirección URL HTTPS en launchsettings. JSON.In development, set an HTTPS URL in launchsettings.json. Habilite HTTPS cuando se use IIS Express.Enable HTTPS when IIS Express is used.

  • Configure un punto de conexión de dirección URL HTTPS para una implementación perimetral de acceso público del servidor Kestrel o http. sys .Configure an HTTPS URL endpoint for a public-facing edge deployment of Kestrel server or HTTP.sys server. La aplicación solo usa un puerto https .Only one HTTPS port is used by the app. El middleware detecta el puerto a través de IServerAddressesFeature.The middleware discovers the port via IServerAddressesFeature.

Nota

Cuando una aplicación se ejecuta en una configuración de proxy inverso, IServerAddressesFeature no está disponible.When an app is run in a reverse proxy configuration, IServerAddressesFeature isn't available. Establezca el puerto con uno de los otros enfoques descritos en esta sección.Set the port using one of the other approaches described in this section.

Implementaciones de EdgeEdge deployments

Cuando Kestrel o HTTP. sys se usa como un servidor perimetral de acceso público, se debe configurar Kestrel o HTTP. sys para que escuche en ambos:When Kestrel or HTTP.sys is used as a public-facing edge server, Kestrel or HTTP.sys must be configured to listen on both:

  • El puerto seguro al que se redirige el cliente (normalmente, 443 en producción y 5001 en desarrollo).The secure port where the client is redirected (typically, 443 in production and 5001 in development).
  • El puerto no seguro (normalmente, 80 en producción y 5000 en desarrollo).The insecure port (typically, 80 in production and 5000 in development).

El cliente debe tener acceso al puerto inseguro para que la aplicación reciba una solicitud no segura y redirija el cliente al puerto seguro.The insecure port must be accessible by the client in order for the app to receive an insecure request and redirect the client to the secure port.

Para obtener más información, consulte configuración del punto de conexión de Kestrel o Implementación del servidor web HTTP.sys en ASP.NET Core.For more information, see Kestrel endpoint configuration or Implementación del servidor web HTTP.sys en ASP.NET Core.

Escenarios de implementaciónDeployment scenarios

Cualquier firewall entre el cliente y el servidor también debe tener puertos de comunicación abiertos para el tráfico.Any firewall between the client and server must also have communication ports open for traffic.

Si las solicitudes se reenvían en una configuración de proxy inverso, use el middleware de encabezados reenviados antes de llamar al middleware de redireccionamiento de HTTPS.If requests are forwarded in a reverse proxy configuration, use Forwarded Headers Middleware before calling HTTPS Redirection Middleware. El middleware de encabezados reenviados actualiza el Request.Scheme, mediante el encabezado de X-Forwarded-Proto.Forwarded Headers Middleware updates the Request.Scheme, using the X-Forwarded-Proto header. El middleware permite que los URI de redirección y otras directivas de seguridad funcionen correctamente.The middleware permits redirect URIs and other security policies to work correctly. Cuando no se usa middleware de encabezados reenviados, es posible que la aplicación de back-end no reciba el esquema correcto y acabe en un bucle de redirección.When Forwarded Headers Middleware isn't used, the backend app might not receive the correct scheme and end up in a redirect loop. Un mensaje de error común del usuario final es que se han producido demasiadas redirecciones.A common end user error message is that too many redirects have occurred.

Al implementar en Azure App Service, siga las instrucciones de Tutorial: enlazar un certificado SSL personalizado existente a Azure Web Apps.When deploying to Azure App Service, follow the guidance in Tutorial: Bind an existing custom SSL certificate to Azure Web Apps.

OpcionesOptions

El siguiente código resaltado llama a AddHttpsRedirection para configurar las opciones de middleware:The following highlighted code calls AddHttpsRedirection to configure middleware options:

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 = StatusCodes.Status307TemporaryRedirect;
        options.HttpsPort = 5001;
    });
}
public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc();

    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 = StatusCodes.Status307TemporaryRedirect;
        options.HttpsPort = 5001;
    });
}

Solo es necesario llamar a AddHttpsRedirection para cambiar los valores de HttpsPort o RedirectStatusCode.Calling AddHttpsRedirection is only necessary to change the values of HttpsPort or RedirectStatusCode.

Código resaltado anterior:The preceding highlighted code:

Configuración de redirecciones permanentes en producciónConfigure permanent redirects in production

De forma predeterminada, el middleware envía un Status307TemporaryRedirect con todos los redireccionamientos.The middleware defaults to sending a Status307TemporaryRedirect with all redirects. Si prefiere enviar un código de estado de redirección permanente cuando la aplicación se encuentra en un entorno que no es de desarrollo, ajuste la configuración de las opciones de middleware en una comprobación condicional para un entorno que no sea de desarrollo.If you prefer to send a permanent redirect status code when the app is in a non-Development environment, wrap the middleware options configuration in a conditional check for a non-Development environment.

Al configurar servicios en Startup.CS:When configuring services 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 = StatusCodes.Status308PermanentRedirect;
            options.HttpsPort = 443;
        });
    }
}

Al configurar servicios en Startup.CS:When configuring services in Startup.cs:

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

Enfoque alternativo de middleware de redirección de HTTPSHTTPS Redirection Middleware alternative approach

Una alternativa al uso del middleware de redirección de HTTPS (UseHttpsRedirection) es usar el middleware de reescritura de direcciones URL (AddRedirectToHttps).An alternative to using HTTPS Redirection Middleware (UseHttpsRedirection) is to use URL Rewriting Middleware (AddRedirectToHttps). AddRedirectToHttps también puede establecer el código de estado y el puerto cuando se ejecuta la redirección.AddRedirectToHttps can also set the status code and port when the redirect is executed. Para obtener más información, vea middleware de reescritura de direcciones URL.For more information, see URL Rewriting Middleware.

Al redirigir a HTTPS sin necesidad de reglas de redirección adicionales, se recomienda usar el middleware de redireccionamiento de HTTPS (UseHttpsRedirection) que se describe en este tema.When redirecting to HTTPS without the requirement for additional redirect rules, we recommend using HTTPS Redirection Middleware (UseHttpsRedirection) described in this topic.

Protocolo de seguridad de transporte estricto HTTP (HSTS)HTTP Strict Transport Security Protocol (HSTS)

Por OWASP, la seguridad de transporte estricta http (HSTS) es una mejora de seguridad opcional que se especifica mediante una aplicación Web mediante el uso de un encabezado de respuesta.Per OWASP, HTTP Strict Transport Security (HSTS) is an opt-in security enhancement that's specified by a web app through the use of a response header. Cuando un explorador que admite HSTS recibe este encabezado:When a browser that supports HSTS receives this header:

  • El explorador almacena la configuración del dominio que evita el envío de cualquier comunicación a través de HTTP.The browser stores configuration for the domain that prevents sending any communication over HTTP. El explorador fuerza toda la comunicación a través de HTTPS.The browser forces all communication over HTTPS.
  • El explorador impide que el usuario Use certificados no confiables o no válidos.The browser prevents the user from using untrusted or invalid certificates. El explorador deshabilita los mensajes que permiten a un usuario confiar temporalmente en este tipo de certificado.The browser disables prompts that allow a user to temporarily trust such a certificate.

Dado que el cliente exige HSTS, tiene algunas limitaciones:Because HSTS is enforced by the client it has some limitations:

  • El cliente debe admitir HSTS.The client must support HSTS.
  • HSTS requiere al menos una solicitud HTTPS correcta para establecer la Directiva HSTS.HSTS requires at least one successful HTTPS request to establish the HSTS policy.
  • La aplicación debe comprobar cada solicitud HTTP y redirigir o rechazar la solicitud HTTP.The application must check every HTTP request and redirect or reject the HTTP request.

ASP.NET Core 2,1 y versiones posteriores implementan HSTS con el método de extensión UseHsts.ASP.NET Core 2.1 and later implements HSTS with the UseHsts extension method. El código siguiente llama a UseHsts cuando la aplicación no está en modo de desarrollo:The following code calls UseHsts when the app isn't in development mode:

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();
    });
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseExceptionHandler("/Error");
        app.UseHsts();
    }

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

    app.UseMvc();
}

UseHsts no se recomienda en el desarrollo porque los exploradores pueden almacenar en memoria caché los valores de HSTS.UseHsts isn't recommended in development because the HSTS settings are highly cacheable by browsers. De forma predeterminada, UseHsts excluye la dirección de bucle invertido local.By default, UseHsts excludes the local loopback address.

En el caso de los entornos de producción que implementan HTTPS por primera vez, establezca HstsOptions. MaxAge inicial en un valor pequeño utilizando uno de los métodos de TimeSpan.For production environments that are implementing HTTPS for the first time, set the initial HstsOptions.MaxAge to a small value using one of the TimeSpan methods. Establezca el valor de horas en no más de un día único en caso de que necesite revertir la infraestructura HTTPS a HTTP.Set the value from hours to no more than a single day in case you need to revert the HTTPS infrastructure to HTTP. Después de estar seguro de la sostenibilidad de la configuración de HTTPS, aumente el valor de HSTS Max-Age. un valor utilizado comúnmente es un año.After you're confident in the sustainability of the HTTPS configuration, increase the HSTS max-age value; a commonly used value is one year.

En el código siguiente:The following code:

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 = StatusCodes.Status307TemporaryRedirect;
        options.HttpsPort = 5001;
    });
}
public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc();

    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 = StatusCodes.Status307TemporaryRedirect;
        options.HttpsPort = 5001;
    });
}
  • Establece el parámetro preload del encabezado STRICT-Transport-Security.Sets the preload parameter of the Strict-Transport-Security header. La precarga no forma parte de la especificación RFC HSTS, pero es compatible con los exploradores Web para precargar sitios de HSTS en la instalación nueva.Preload isn't part of the RFC HSTS specification, but is supported by web browsers to preload HSTS sites on fresh install. Consulte https://hstspreload.org/ para obtener más información.See https://hstspreload.org/ for more information.
  • Habilita includeSubDomain, que aplica la Directiva HSTS para hospedar subdominios.Enables includeSubDomain, which applies the HSTS policy to Host subdomains.
  • Establece explícitamente el parámetro Max-Age del encabezado STRICT-Transport-Security en 60 días.Explicitly sets the max-age parameter of the Strict-Transport-Security header to 60 days. Si no se establece, el valor predeterminado es 30 días.If not set, defaults to 30 days. Para obtener más información, vea la Directiva Max-Age .See the max-age directive for more information.
  • Agrega example.com a la lista de hosts que se van a excluir.Adds example.com to the list of hosts to exclude.

UseHsts excluye los siguientes hosts de bucle invertido:UseHsts excludes the following loopback hosts:

  • localhost: la dirección de bucle invertido IPv4.localhost : The IPv4 loopback address.
  • 127.0.0.1: la dirección de bucle invertido IPv4.127.0.0.1 : The IPv4 loopback address.
  • [::1]: dirección de bucle invertido IPv6.[::1] : The IPv6 loopback address.

No participar en HTTPS/HSTS en la creación de proyectosOpt-out of HTTPS/HSTS on project creation

En algunos escenarios de servicio de back-end en los que la seguridad de la conexión se controla en el perímetro de acceso público de la red, no es necesario configurar la seguridad de conexión en cada nodo.In some backend service scenarios where connection security is handled at the public-facing edge of the network, configuring connection security at each node isn't required. Las aplicaciones web que se generan a partir de las plantillas en Visual Studio o desde el comando dotnet New habilitan la redirección de https y HSTS.Web apps that are generated from the templates in Visual Studio or from the dotnet new command enable HTTPS redirection and HSTS. En el caso de las implementaciones que no requieren estos escenarios, puede optar por HTTPS/HSTS cuando la aplicación se crea a partir de la plantilla.For deployments that don't require these scenarios, you can opt-out of HTTPS/HSTS when the app is created from the template.

Para no participar en HTTPS/HSTS:To opt-out of HTTPS/HSTS:

Desactive la casilla configurar para https .Uncheck the Configure for HTTPS check box.

Cuadro de diálogo Nueva ASP.NET Core aplicación web que muestra la casilla de verificación configurar para HTTPS no seleccionada.

Cuadro de diálogo Nueva ASP.NET Core aplicación web que muestra la casilla de verificación configurar para HTTPS no seleccionada.

Confíe en el certificado de desarrollo de ASP.NET Core HTTPS en Windows y macOSTrust the ASP.NET Core HTTPS development certificate on Windows and macOS

El SDK de .NET Core incluye un certificado de desarrollo de HTTPS.The .NET Core SDK includes an HTTPS development certificate. El certificado se instala como parte de la experiencia de primera ejecución.The certificate is installed as part of the first-run experience. Por ejemplo, dotnet --info produce una salida similar a la siguiente:For example, dotnet --info produces output similar to the following:

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.

Al instalar el SDK de .NET Core se instala el certificado de desarrollo HTTPS de ASP.NET Core en el almacén de certificados local del usuario.Installing the .NET Core SDK installs the ASP.NET Core HTTPS development certificate to the local user certificate store. El certificado se ha instalado, pero no es de confianza.The certificate has been installed, but it's not trusted. Para confiar en el certificado, realice el paso de una vez para ejecutar la herramienta dotnet dev-certs:To trust the certificate perform the one-time step to run the dotnet dev-certs tool:

dotnet dev-certs https --trust

El siguiente comando proporciona ayuda sobre la herramienta dev-certs:The following command provides help on the dev-certs tool:

dotnet dev-certs https --help

Cómo configurar un certificado de desarrollador para DockerHow to set up a developer certificate for Docker

Consulte este problema de GitHub.See this GitHub issue.

Confiar en el certificado HTTPS del subsistema de Windows para LinuxTrust HTTPS certificate from Windows Subsystem for Linux

El subsistema de Windows para Linux (WSL) genera un certificado autofirmado HTTPS. Para configurar el almacén de certificados de Windows para que confíe en el certificado WSL:The Windows Subsystem for Linux (WSL) generates a HTTPS self-signed cert. To configure the Windows certificate store to trust the WSL certificate:

  • Ejecute el siguiente comando para exportar el certificado generado por WSL: dotnet dev-certs https -ep %USERPROFILE%\.aspnet\https\aspnetapp.pfx -p <cryptic-password>Run the following command to export the WSL generated certificate: dotnet dev-certs https -ep %USERPROFILE%\.aspnet\https\aspnetapp.pfx -p <cryptic-password>

  • En una ventana de WSL, ejecute el siguiente comando: ASPNETCORE_Kestrel__Certificates__Default__Password="<cryptic-password>" ASPNETCORE_Kestrel__Certificates__Default__Path=/mnt/c/Users/user-name/.aspnet/https/aspnetapp.pfx dotnet watch runIn a WSL window, run the following command: ASPNETCORE_Kestrel__Certificates__Default__Password="<cryptic-password>" ASPNETCORE_Kestrel__Certificates__Default__Path=/mnt/c/Users/user-name/.aspnet/https/aspnetapp.pfx dotnet watch run

    El comando anterior establece las variables de entorno, por lo que Linux usa el certificado de confianza de Windows.The preceding command sets the environment variables so Linux uses the Windows trusted certificate.

Solucionar problemas de certificadosTroubleshoot certificate problems

En esta sección se proporciona ayuda cuando se ha instalado y se confíaen el certificado de desarrollo de ASP.net Core https, pero sigue teniendo en cuenta las advertencias del explorador de que el certificado no es de confianza.This section provides help when the ASP.NET Core HTTPS development certificate has been installed and trusted, but you still have browser warnings that the certificate is not trusted. Kestrelusa el certificado de desarrollo de https ASP.net Core.The ASP.NET Core HTTPS development certificate is used by Kestrel.

Todas las plataformas: el certificado no es de confianzaAll platforms - certificate not trusted

Ejecute los comandos siguientes:Run the following commands:

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

Cierre todas las instancias del explorador abiertas.Close any browser instances open. Abra una nueva ventana del explorador en la aplicación.Open a new browser window to app. Los exploradores almacenan en caché la confianza de certificados.Certificate trust is cached by browsers.

Los comandos anteriores solucionan la mayoría de los problemas de confianza del explorador.The preceding commands solve most browser trust issues. Si el explorador sigue sin confiar en el certificado, siga las sugerencias específicas de la plataforma que se indican a continuación.If the browser is still not trusting the certificate, follow the platform specific suggestions that follow.

Docker: certificado no confiableDocker - certificate not trusted

  • Elimine la carpeta C:\Users{usuario} \AppData\Roaming\ASP.NET\HttpsDelete the C:\Users{USER}\AppData\Roaming\ASP.NET\Https folder.
  • Limpie la solución.Clean the solution. Elimine las carpetas bin y obj.Delete the bin and obj folders.
  • Reinicie la herramienta de desarrollo.Restart the development tool. Por ejemplo, Visual Studio, Visual Studio Code o Visual Studio para Mac.For example, Visual Studio, Visual Studio Code, or Visual Studio for Mac.

Windows-certificado no confiableWindows - certificate not trusted

  • Compruebe los certificados en el almacén de certificados.Check the certificates in the certificate store. Debe haber un certificado de localhost con el ASP.NET Core HTTPS development certificate nombre descriptivo en Current User > Personal > Certificates y Current User > Trusted root certification authorities > CertificatesThere should be a localhost certificate with the ASP.NET Core HTTPS development certificate friendly name both under Current User > Personal > Certificates and Current User > Trusted root certification authorities > Certificates
  • Quite todos los certificados encontrados de las entidades de certificación personales y de confianza.Remove all the found certificates from both Personal and Trusted root certification authorities. No Quite el certificado de host local IIS Express.Do not remove the IIS Express localhost certificate.
  • Ejecute los comandos siguientes:Run the following commands:
dotnet dev-certs https --clean
dotnet dev-certs https --trust

Cierre todas las instancias del explorador abiertas.Close any browser instances open. Abra una nueva ventana del explorador en la aplicación.Open a new browser window to app.

OS X: certificado no confiableOS X - certificate not trusted

  • Abra el acceso a llaves.Open KeyChain Access.
  • Seleccione la cadena de claves del sistema.Select the System keychain.
  • Compruebe la presencia de un certificado localhost.Check for the presence of a localhost certificate.
  • Compruebe que contiene un símbolo de + en el icono para indicar su confianza para todos los usuarios.Check that it contains a + symbol on the icon to indicate its trusted for all users.
  • Quite el certificado de la cadena de claves del sistema.Remove the certificate from the system keychain.
  • Ejecute los comandos siguientes:Run the following commands:
dotnet dev-certs https --clean
dotnet dev-certs https --trust

Cierre todas las instancias del explorador abiertas.Close any browser instances open. Abra una nueva ventana del explorador en la aplicación.Open a new browser window to app.

Vea error de https mediante IIS Express (dotnet/AspNetCore #16892) para solucionar problemas de certificados con Visual Studio.See HTTPS Error using IIS Express (dotnet/AspNetCore #16892) for troubleshooting certificate issues with Visual Studio.

IIS Express certificado SSL usado con Visual StudioIIS Express SSL certificate used with Visual Studio

Para solucionar problemas con el certificado de IIS Express, seleccione reparar en el instalador de Visual Studio.To fix problems with the IIS Express certificate, select Repair from the Visual Studio installer. Para más información, consulte este problema de GitHub.For more information, see this GitHub issue.

Información adicionalAdditional information