Hospedaje de imágenes ASP.NET Core con Docker a través de HTTPS

Por Rick Anderson

ASP.NET Core usa HTTPS de forma predeterminada. HTTPS se basa en certificados para la confianza, la identidad y el cifrado.

En este documento se explica cómo ejecutar imágenes de contenedor pregeneradas con HTTPS mediante la interfaz de línea de comandos (CLI) de .NET. Para obtener instrucciones sobre cómo ejecutar Docker en desarrollo con Visual Studio, consulte Desarrollo de aplicaciones de ASP.NET Core con Docker a través de HTTPS.

En este ejemplo se necesita la versión Docker 17.06 o posterior del cliente Docker.

Prerrequisitos

El SDK de .NET actual.

Certificados

Se requiere un certificado de una entidad de certificación para el hospedaje de producción para un dominio. Let's Encrypt es una entidad de certificación que ofrece certificados gratuitos.

Este documento utiliza certificados de desarrollo autofirmados para alojar imágenes preconstruidas a través de localhost. Las instrucciones son similares al uso de certificados de producción. El certificado generado por dotnet dev-certs es para usar solo con localhost y no debe usarse en un entorno como Kubernetes. Para admitir HTTPS en un clúster de Kubernetes, use las herramientas proporcionadas por Gestionar certificados TLS en un clúster para configurar TLS dentro de pods.

Utilice dotnet dev-certs para crear certificados autofirmados para desarrollo y pruebas.

Para los certificados de producción:

  • La herramienta dotnet dev-certs no es necesaria.
  • No es necesario almacenar los certificados en la ubicación usada en las instrucciones. Cualquier ubicación debe funcionar, aunque no se recomienda almacenar certificados en el directorio de su sitio.

Las instrucciones contenidas en la siguiente sección montan certificados en contenedores como volúmenes mediante la opción de línea de comandos -v de Docker. Puede agregar certificados a imágenes de contenedor con un comando COPY en un Dockerfile, pero no se recomienda. No se recomienda copiar certificados en una imagen por los siguientes motivos:

  • Es difícil usar la misma imagen para realizar pruebas con certificados de desarrollador.
  • Es difícil usar la misma imagen para Hosting con certificados de producción.
  • Existe un riesgo significativo de divulgación de certificados.

Ejecutar imágenes de contenedor predefinidas con HTTPS

Siga las instrucciones a continuación para la configuración del sistema operativo.

Windows usando contenedores de Linux

Genere un certificado y configure la máquina local:

dotnet dev-certs https -ep %USERPROFILE%\.aspnet\https\aspnetapp.pfx -p <CREDENTIAL_PLACEHOLDER>
dotnet dev-certs https --trust

En los comandos anteriores, reemplace <CREDENTIAL_PLACEHOLDER> por una contraseña.

Ejecute la imagen de contenedor con ASP.NET Core configurado para HTTPS en un shell de comandos:

docker pull mcr.microsoft.com/dotnet/samples:aspnetapp
docker run --rm -it -p 8000:80 -p 8001:443 -e ASPNETCORE_URLS="https://+;http://+" -e ASPNETCORE_HTTPS_PORTS=443 -e ASPNETCORE_Kestrel__Certificates__Default__Password="<CREDENTIAL_PLACEHOLDER>" -e ASPNETCORE_Kestrel__Certificates__Default__Path=/https/aspnetapp.pfx -v %USERPROFILE%\.aspnet\https:/https/ mcr.microsoft.com/dotnet/samples:aspnetapp

En el código anterior, reemplace <CREDENTIAL_PLACEHOLDER> por la contraseña. La contraseña debe coincidir con la contraseña usada para el certificado.

Al usar PowerShell, reemplace %USERPROFILE% por $env:USERPROFILE.

El certificado en este caso debe ser un archivo .pfx. No se admite utilizar un archivo .crt o .key con o sin contraseña en el contenedor de ejemplo. Por ejemplo, al especificar un archivo .crt, el contenedor puede devolver mensajes de error como 'El modo de servidor SSL debe usar un certificado con la clave privada asociada'. Al usar WSL, valide la ruta de acceso de montaje para asegurarse de que el certificado se carga correctamente.

Note

No confunda la clave de configuración HTTPS_PORTS ni la variable de entorno ASPNETCORE_HTTPS_PORTS, que establecen los puertos para la configuración de puntos de conexión de Kestrel/HTTP.sys, con la clave de configuración HTTPS_PORT ni la variable de entorno ASPNETCORE_HTTPS_PORT, que establecen el puerto del middleware de redirección HTTPS.

macOS o Linux

Genere el certificado y configure la máquina local:

dotnet dev-certs https -ep ${HOME}/.aspnet/https/aspnetapp.pfx -p <CREDENTIAL_PLACEHOLDER>
dotnet dev-certs https --trust

En Linux, dotnet dev-certs https --trust requiere el SDK de .NET 9 o posterior. Para Linux en .NET 8.0.401 o un SDK anterior, consulte la documentación de la distribución de Linux para confiar en un certificado.

En los comandos anteriores, reemplace <CREDENTIAL_PLACEHOLDER> por una contraseña.

Ejecute la imagen de contenedor con ASP.NET Core configurado para HTTPS:

docker pull mcr.microsoft.com/dotnet/samples:aspnetapp
docker run --rm -it -p 8000:80 -p 8001:443 -e ASPNETCORE_URLS="https://+;http://+" -e ASPNETCORE_HTTPS_PORTS=443 -e ASPNETCORE_Kestrel__Certificates__Default__Password="<CREDENTIAL_PLACEHOLDER>" -e ASPNETCORE_Kestrel__Certificates__Default__Path=/https/aspnetapp.pfx -v ${HOME}/.aspnet/https:/https/ mcr.microsoft.com/dotnet/samples:aspnetapp

En el código anterior, reemplace <CREDENTIAL_PLACEHOLDER> por la contraseña. La contraseña debe coincidir con la contraseña usada para el certificado.

Note

No confunda la clave de configuración HTTPS_PORTS ni la variable de entorno ASPNETCORE_HTTPS_PORTS, que establecen los puertos para la configuración de puntos de conexión de Kestrel/HTTP.sys, con la clave de configuración HTTPS_PORT ni la variable de entorno ASPNETCORE_HTTPS_PORT, que establecen el puerto del middleware de redirección HTTPS.

Windows que usa contenedores de Windows

Genere el certificado y configure la máquina local:

dotnet dev-certs https -ep %USERPROFILE%\.aspnet\https\aspnetapp.pfx -p <CREDENTIAL_PLACEHOLDER>
dotnet dev-certs https --trust

En los comandos anteriores, reemplace <CREDENTIAL_PLACEHOLDER> por una contraseña. Al usar PowerShell, reemplace %USERPROFILE% por $env:USERPROFILE.

Ejecute la imagen de contenedor con ASP.NET Core configurado para HTTPS:

docker pull mcr.microsoft.com/dotnet/samples:aspnetapp
docker run --rm -it -p 8000:80 -p 8001:443 -e ASPNETCORE_URLS="https://+;http://+" -e ASPNETCORE_HTTPS_PORTS=443 -e ASPNETCORE_Kestrel__Certificates__Default__Password="<CREDENTIAL_PLACEHOLDER>" -e ASPNETCORE_Kestrel__Certificates__Default__Path=c:\https\aspnetapp.pfx -v %USERPROFILE%\.aspnet\https:C:\https\ --user ContainerAdministrator mcr.microsoft.com/dotnet/samples:aspnetapp

NOTE:<CREDENTIAL_PLACEHOLDER> es un marcador de posición para la contraseña predeterminada de los certificados Kestrel.

La contraseña debe coincidir con la contraseña usada para el certificado. Al usar PowerShell, reemplace %USERPROFILE% por $env:USERPROFILE.

Desarrollo de aplicaciones ASP.NET Core con Docker a través de HTTPS

Consulte Desarrollo de aplicaciones ASP.NET Core con Docker mediante HTTPS para obtener información y ejemplos sobre cómo desarrollar aplicaciones ASP.NET Core con HTTPS en contenedores de Docker.

Consulte también

ASP.NET Core usa HTTPS de forma predeterminada. HTTPS se basa en certificados para la confianza, la identidad y el cifrado.

En este documento se explica cómo ejecutar imágenes de contenedor pregeneradas con HTTPS mediante la interfaz de línea de comandos (CLI) de .NET. Para obtener instrucciones sobre cómo ejecutar Docker en desarrollo con Visual Studio, consulte Desarrollo de aplicaciones de ASP.NET Core con Docker a través de HTTPS.

En este ejemplo se necesita la versión Docker 17.06 o posterior del cliente Docker.

Prerrequisitos

El SDK de .NET actual.

Certificados

Se requiere un certificado de una entidad de certificación para el hospedaje de producción para un dominio. Let's Encrypt es una entidad de certificación que ofrece certificados gratuitos.

Este documento utiliza certificados de desarrollo autofirmados para alojar imágenes preconstruidas a través de localhost. Las instrucciones son similares al uso de certificados de producción. El certificado generado por dotnet dev-certs se usa solo con localhost y no debe usarse en un entorno como Kubernetes. Para admitir HTTPS en un clúster de Kubernetes, use las herramientas proporcionadas por Administración de certificados TLS en un clúster para configurar TLS dentro de pods.

Utiliza dotnet dev-certs para crear certificados autofirmados para desarrollo y pruebas.

Para los certificados de producción:

  • La herramienta dotnet dev-certs no es necesaria.
  • No es necesario almacenar los certificados en la ubicación usada en las instrucciones. Cualquier ubicación debe funcionar, aunque no se recomienda almacenar certificados en el directorio del sitio.

Las instrucciones contenidas en la siguiente sección montan los certificados como volúmenes en contenedores mediante la opción de línea de comandos -v de Docker. Puede agregar certificados a imágenes de contenedor con un comando COPY en un Dockerfile, pero no se recomienda. No se recomienda copiar certificados en una imagen por los siguientes motivos:

  • Es difícil usar la misma imagen para realizar pruebas con certificados de desarrollador.
  • Es difícil usar la misma imagen para Hosting con certificados de producción.
  • Existe un riesgo significativo de divulgación de certificados.

Ejecución de imágenes de contenedor pregeneradas con HTTPS

Siga las instrucciones a continuación para la configuración del sistema operativo.

Windows usando contenedores de Linux

Genere un certificado y configure la máquina local:

dotnet dev-certs https -ep %USERPROFILE%\.aspnet\https\aspnetapp.pfx -p <CREDENTIAL_PLACEHOLDER>
dotnet dev-certs https --trust

En los comandos anteriores, reemplace <CREDENTIAL_PLACEHOLDER> por una contraseña.

Ejecute la imagen de contenedor con ASP.NET Core configurado para HTTPS en un shell de comandos:

docker pull mcr.microsoft.com/dotnet/samples:aspnetapp
docker run --rm -it -p 8000:80 -p 8001:443 -e ASPNETCORE_URLS="https://+:443;http://+" -e ASPNETCORE_Kestrel__Certificates__Default__Password="<CREDENTIAL_PLACEHOLDER>" -e ASPNETCORE_Kestrel__Certificates__Default__Path=/https/aspnetapp.pfx -v %USERPROFILE%\.aspnet\https:/https/ mcr.microsoft.com/dotnet/samples:aspnetapp

En el código anterior, reemplace <CREDENTIAL_PLACEHOLDER> por la contraseña. La contraseña debe coincidir con la contraseña usada para el certificado.

Al usar PowerShell, reemplace %USERPROFILE% por $env:USERPROFILE.

Nota: El certificado en este caso debe ser un archivo de tipo .pfx. No se admite el uso de un archivo .crt o .key con o sin la contraseña con el contenedor de ejemplo. Por ejemplo, al especificar un archivo .crt, el contenedor puede devolver mensajes de error como 'El modo de servidor SSL debe usar un certificado con la clave privada asociada'. Al usar WSL, valide la ruta de acceso de montaje para asegurarse de que el certificado se carga correctamente.

macOS o Linux

Genere el certificado y configure la máquina local:

dotnet dev-certs https -ep ${HOME}/.aspnet/https/aspnetapp.pfx -p <CREDENTIAL_PLACEHOLDER>
dotnet dev-certs https --trust

dotnet dev-certs https --trust solo se admite en macOS y Windows. Debe confiar en los certificados en Linux de la manera que admite su distribución. Es probable que tenga que confiar en el certificado en su navegador.

En los comandos anteriores, reemplace <CREDENTIAL_PLACEHOLDER> por una contraseña.

Ejecute la imagen de contenedor con ASP.NET Core configurado para HTTPS:

docker pull mcr.microsoft.com/dotnet/samples:aspnetapp
docker run --rm -it -p 8000:80 -p 8001:443 -e ASPNETCORE_URLS="https://+:443;http://+" -e ASPNETCORE_Kestrel__Certificates__Default__Password="<CREDENTIAL_PLACEHOLDER>" -e ASPNETCORE_Kestrel__Certificates__Default__Path=/https/aspnetapp.pfx -v ${HOME}/.aspnet/https:/https/ mcr.microsoft.com/dotnet/samples:aspnetapp

En el código anterior, reemplace <CREDENTIAL_PLACEHOLDER> por la contraseña. La contraseña debe coincidir con la contraseña usada para el certificado.

Windows con contenedores de Windows

Genere el certificado y configure la máquina local:

dotnet dev-certs https -ep %USERPROFILE%\.aspnet\https\aspnetapp.pfx -p <CREDENTIAL_PLACEHOLDER>
dotnet dev-certs https --trust

En los comandos anteriores, reemplace <CREDENTIAL_PLACEHOLDER> por una contraseña. Al usar PowerShell, reemplace %USERPROFILE% por $env:USERPROFILE.

Ejecute la imagen de contenedor con ASP.NET Core configurado para HTTPS:

docker pull mcr.microsoft.com/dotnet/samples:aspnetapp
docker run --rm -it -p 8000:80 -p 8001:443 -e ASPNETCORE_URLS="https://+:443;http://+" -e ASPNETCORE_Kestrel__Certificates__Default__Password="<CREDENTIAL_PLACEHOLDER>" -e ASPNETCORE_Kestrel__Certificates__Default__Path=c:\https\aspnetapp.pfx -v %USERPROFILE%\.aspnet\https:C:\https\ --user ContainerAdministrator mcr.microsoft.com/dotnet/samples:aspnetapp

NOTA:<CREDENTIAL_PLACEHOLDER> es un marcador de posición para la contraseña predeterminada de los certificados Kestrel.

La contraseña debe coincidir con la contraseña usada para el certificado. Al usar PowerShell, reemplace %USERPROFILE% por $env:USERPROFILE.

Desarrollo de aplicaciones ASP.NET Core con Docker a través de HTTPS

Consulte Desarrollo de aplicaciones de ASP.NET Core con Docker a través de HTTPS para obtener información y ejemplos sobre cómo desarrollar aplicaciones ASP.NET Core con HTTPS en contenedores de Docker.

Consulte también