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, identity 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 en 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.

Use 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 el siguiente volumen de la sección montan certificados 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 hospedar 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://+;http://+" -e ASPNETCORE_HTTPS_PORTS=8001 -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 .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

En Linux, dotnet dev-certs https --trust requiere el SDK de .NET 9 o una versión posterior. Para Linux en el SDK de .NET 8.0.401 y versiones anteriores, consulta la documentación de tu 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=8001 -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://+;http://+" -e ASPNETCORE_HTTPS_PORTS=8001 -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 certificados Kestrel.

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

Developing ASP.NET Core Applications with Docker over HTTPS (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

ASP.NET Core usa HTTPS de forma predeterminada. HTTPS se basa en certificados para la confianza, identity 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 en 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.

Use 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 el siguiente volumen de la sección montan certificados 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 hospedar 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://+;http://+" -e ASPNETCORE_HTTPS_PORTS=8001 -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 .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 los certificados en Linux de la manera que admite su distribución. Es probable que tenga que confiar su certificado en el explorador.

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=8001 -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://+;http://+" -e ASPNETCORE_HTTPS_PORTS=8001 -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 certificados Kestrel.

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

Developing ASP.NET Core Applications with Docker over HTTPS (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