HTTPS en ASP.NET Core desde cero

Recientemente, al analizar cómo configurar la autenticación mediante proveedores de inicio de sesión externos (por ejemplo, Google, Facebook) con ASP.NET Core Me di cuenta de que https es ahora un requisito para algunos de ellos.

Otra cosa que noté fue lo difícil que era encontrar recursos para habilitar HTTPS en ASP.NET Núcleo.

Esta entrada de blog trata sobre el proceso de creación de un ASP local.Sitio web de NET Core que se ejecuta con HTTPS sin errores en Chrome (que muestra el candado verde en la barra de direcciones) para su hora de desarrollo local. Y luego, cómo puede usar Nginx o IIS cuando esté listo para exponerlo al mundo.

HTTPS ASP.NET CORE

para utilizar HTTPS necesitamos un certificado digital. Si necesita generar el suyo propio para usarlo en tiempo de desarrollo, le recomiendo usar OpenSSL para Crear certificados. No solo explica cómo puede crear su propia autoridad de certificación y certificados, sino también cómo puede configurar su navegador (Chrome o Firefox) para que confíe en la autoridad de certificación.

Además, si desea comprender cuál es el papel de los certificados en HTTPS, eche un vistazo a la breve explicación de cómo funciona https.

A partir de ahora asumo que ha generado su autoridad de certificación, certificado y clave privada correspondiente y tiene un .Archivo pfx (Intercambio de Información Personal).

Crear un nuevo proyecto

Describiré el proceso utilizando Visual Studio Code y Yeoman.

Si no está familiarizado con yeoman, es una herramienta de línea de comandos que le permite crear nuevos proyectos a partir de una lista de plantillas de proyectos. El generador yeoman (ese es el nombre del paquete para yeoman que contiene las plantillas) que vamos a usar es generator-aspnet. Para instalar yeoman, primero necesita npm y luego puede seguir las instrucciones para instalar yeoman y el ASP.NET Plantillas básicas aquí.

La razón para usar Visual Studio Code y yeoman es que este proceso funciona en Windows, Linux y macOS.

Para usar yeoman con el ASP.NET Core templates ejecute el siguiente comando:

$ yo aspnet _-----_ ╭──────────────────────────╮ | | │ Welcome to the │ |--(o)--| │ marvellous ASP.NET Core │`---------´ │ generator! │ ( _´U`_ ) ╰──────────────────────────╯ /___A___\ / | ~ | __'.___.'__ ´ ` |° ´ Y ` ? What type of application do you want to create? (Use arrow keys)❯ Empty Web Application Empty Web Application (F#) Console Application Console Application (F#) Web Application Web Application Basic Web Application Basic (F#) 

Seleccione Aplicación Web Vacía. Se creará un proyecto web simple que solo tiene una página con el texto «Hola Mundo».

Si está ejecutando Windows y tiene la versión completa de Visual Studio, solo puede hacer Archivo – > Nuevo proyecto, seleccione. Net Core, ASP.NET Aplicación Web principal y, a continuación, seleccione Vacío.

Configurar HTTPS para Kestrel

Kestrel es el servidor web que se utiliza de forma predeterminada con ASP.NET Núcleo.

Para agregar compatibilidad con HTTPS a Kestrel, agregue el paquete Microsoft.AspNetCore.Server.Kestrel.Https como dependencia.

Si está utilizando proyecto.json puedes hacer esto editando el proyecto.sección de «dependencias» de json y adición:

"Microsoft.AspNetCore.Server.Kestrel.Https": "1.1.0"

El número de versión puede ser diferente para usted, sin embargo, debe ser el mismo que el utilizado en el paquete Microsoft.AspNetCore.Server.Kestrel.

Si está utilizando .csproj puede agregar la dependencia ejecutando:

dotnet add package Microsoft.AspNetCore.Server.Kestrel.Https

Configuración del certificado

Para configurar Kestrel para que use nuestro .archivo pfx (certificado y clave privada) necesitamos editar Program.cs donde se está creando el WebHostBuilder y hacer algunos cambios:

var host = new WebHostBuilder() .UseConfiguration(config) .UseKestrel(options => { options.UseHttps("localhost.pfx", "password"); }) .UseContentRoot(Directory.GetCurrentDirectory()) .UseIISIntegration() .UseUrls("https://*:4430") .UseStartup<Startup>() .Build();

Los cambios son:

.UseKestrel(options => { options.UseHttps("localhost.pfx", "password");})

Que es donde especificamos cuál es el .archivo pfx que queremos usar y su contraseña. UseHttps es un método de extensión, si obtienes un error diciendo que no existe es porque no agregaste el paquete Microsoft.AspNetCore.Server.Kestrel.Https nuget, que es donde vive.

También:

.UseUrls("https://*:4430")

Que define dónde estará escuchando Kestrel para las conexiones entrantes. Alternativamente, puede usar https://localhost:4430 en lugar de *. Sin embargo, con * puede usar cualquier nombre de dominio, por ejemplo, si tiene esta aplicación web en myDomain.com seguiría funcionando, mientras que con localhost solo se servirían las solicitudes a localhost.

En caso de que se pregunte por qué no usé el puerto HTTPS predeterminado, 443, es porque necesita permisos especiales en Linux para puertos inferiores a 1024. En Windows esto no sería un problema. Sin embargo, debido a que hacer esto con cernícalo solo se recomienda cuando se está en el momento del desarrollo, no es un gran problema.

Si está probando esto en Linux, macOS o utilizando la línea de comandos en Windows, puede llamar a dotnet run, abrir Chrome e ir a https://localhost:43000 y ver un icono de candado verde.

Si utiliza Visual Studio completo en Windows, la forma de hacerlo es especificar que desea ejecutar la aplicación web directamente y no a través de IIS Express:

Seleccione la aplicación en las opciones de ejecución

También seleccione el navegador en el que desea probarla. Si instaló el certificado de la autoridad de certificación raíz de prueba en un navegador específico, use ese navegador, por ejemplo, Chrome (si está confundido por esta declaración, le recomiendo que lea una breve explicación (ish) de cómo funciona https y Use OpenSSL para crear certificados):

Seleccione Chrome como navegador para probar la aplicación en

Finalmente, edite las propiedades del proyecto (haga clic con el botón derecho y seleccione propiedades):

Haga clic con el botón derecho y seleccione propiedades

y cambie la url de inicio:

Cambiar la url de lanzamiento

Usando ASP.NET Núcleo con un proxy inverso

Aunque ciertamente es posible servir una aplicación web utilizando ASP.NET Núcleo usando solo cernícalo, no se recomienda. Esto se debe a que Kestrel no es un servidor web con todas las funciones y todavía carece de algunas características de seguridad.

Aunque no se recomienda, es posible que solo desee mostrar algo que ha hecho a alguien y omitir la parte de instalar y configurar un servidor web. Con servicios como DigitalOcean o Linode, puede crear un VPS en muy poco tiempo y tener su ASP.NET Núcleo disponible a través de allí, solo tiene que instalar. net core.

Sin embargo, si desea algo más serio (y probablemente lo haga ya que está aquí debido a que habilita HTTPS), debe usar un servidor web con todas las funciones, como Nginx o IIS (en Windows), como proxy inverso a su ASP.NET Aplicación principal.

Un servidor proxy inverso es un servidor web que acepta solicitudes y las envía a otro servidor web que realmente crea las respuestas para esas solicitudes. Las respuestas se envían de vuelta al servidor proxy, que las reenvía a los clientes que emitieron las solicitudes correspondientes.

Con Nginx actuando como proxy inverso, se vería algo como esto:

Browser <----> Nginx <----> Kestrel

Lo bueno de esta configuración es que podemos aprovechar Nginx (o IIS) como un servidor web completo y habilitar HTTPS en él:

Browser <---- HTTPS ---> Nginx <---- HTTP ----> Kestrel

Así que ni siquiera necesitamos configurar Kestrel con HTTPS, solo Nginx.

Configurar HTTPS con Nginx

Primero debe instalar Nginx. Estoy usando Ubuntu 16.04 para esto, sin embargo, incluso puedes instalarlo en Windows.

Si está ejecutando Ubuntu, abra un terminal y escriba

$ sudo apt-get install nginx

Lo siguiente que tenemos que hacer es editar la configuración de Nginx. Pero antes de hacerlo, es útil saber cuál es la ubicación de los archivos de configuración y cómo se habilitan. La carpeta donde normalmente se colocan los archivos de configuración es /etc/nginx/sites-available/ (esta ubicación puede ser diferente si está utilizando una distribución de Linux diferente).

El archivo de configuración que está presente cuando instala Nginx se llama default.

Para que una configuración de Nginx se habilite, debe estar ubicada en la carpeta /etc/nginx/sites-enabled. Por lo tanto, después de crear un nuevo archivo de configuración (en sites-available), se crea un enlace simbólico en sites-enabled que apunta al nuevo archivo.

Imagine que acabamos de crear un nuevo archivo de configuración llamado my-site-https en sites-available. Después de eso, iría a la carpeta sites-enabled y ejecutaría el siguiente comando para crear un enlace simbólico:

$ ln -s /etc/nginx/sites-available/my-site-htts

Para hacer que Nginx lea esta nueva configuración, ejecute el comando:

$ sudo nginx -s reload

Ahora que sabemos cómo crear y habilitar configuraciones de Nginx, vamos a crear el archivo de configuración para configurar Nginx como proxy inverso a un ASP.NET Aplicación principal que se ejecuta en http://localhost:5000.

Primero cree un nuevo archivo en /etc/nginx/sites-available con el nombre, por ejemplo, aspnetcore, con el siguiente contenido:

server { listen 443 ssl; ssl_certificate PATH_TO_CERTIFICATE/CERTIFICATE_NAME.pem; ssl_certificate_key PATH_TO_PRIVATE_KEY/PRIVATE_KEY.pem; location / { proxy_pass http://localhost:5000; }}

Aquí estamos configurando Nginx a listen al puerto 443 usando SSL (443 es el valor predeterminado para HTTPS). A continuación, estamos especificando dónde se encuentran el certificado (ssl_certificate) y la clave privada (ssl_certificate_key) y, finalmente, estamos instruyendo a Nginx para que reenvíe todas las solicitudes (location / coincidirá con todas las solicitudes) a http://localhost:5000.

Finalmente, cree el enlace simbólico a este archivo en sites-enabled (puede eliminar el enlace al archivo default, esto no eliminará el archivo original ya que es un enlace simbólico).

/etc/nginx/sites-enabled$ sudo ln -s /etc/nginx/sites-available/aspnetcore

Para hacer que Nginx cargue esta configuración:

$ sudo nginx -s reload

Si usted tiene su ASP.NET La aplicación principal que se ejecuta en http://localhost:5000 ahora debería poder abrir https://localhost y ver que se sirve a través de HTTPS.

Hay un problema común que puede ocurrir al recargar la configuración de Nginx, que es que se le solicita una contraseña. Específicamente para la contraseña de la clave privada. Esto puede no ser práctico para usted, por lo que si desea eliminar la contraseña de la clave privada, puede ejecutar el siguiente comando:

$ openssl rsa -in privateKeyWithPassword.pem -out privateKeyWithoutPassword.pem

Otra cosa útil que puede hacer con Nginx es que todas las solicitudes a HTTP se redirigan a HTTPS. Si desea habilitar esto, agregue esta configuración adicional al archivo de configuración aspnetcore Nginx:

server { listen 80; return 301 https://$host$request_uri;}

Configurando Supervisor

Una cosa que debemos preocuparnos es que necesitamos mantener ASP.NET Aplicación web principal en ejecución.

Hay una herramienta llamada supervisor que nos permite configurar que una aplicación debe iniciarse en el momento del inicio, y si se bloquea, debe volver a activarse

Lo primero que tenemos que hacer es instalarla. Estoy usando Ubuntu 16.04 para esto, y en esta distribución instalarlo es muy simple:

$ sudo apt-get install supervisor

Lo siguiente que tenemos que hacer es crear un archivo de configuración de supervisor para nuestra aplicación web. Vamos a llamarlo aspnetcore.conf y agregarlo a /etc/supervisor/conf.d (necesita hacer esto usando sudo):

Coloque esto dentro del archivo de configuración:

command=/usr/bin/dotnet PATH_TO_YOUR_PUBLISHED_PROJECT/YOURWEBAPP.dlldirectory=PATH_TO_YOUR_PUBLISHED_PROJECTautostart=trueautorestart=truestdout_logfile=/var/log/aspnetcore.out.logstderr_logfile=/var/log/aspnetcore.err.logenvironment=ASPNETCORE_ENVIRONMENT="Production"

La primera línea define el nombre (aspnetcore) con el que podemos referirnos a la aplicación web en supervisor.

La línea con command define el comando a ejecutar. En este caso, es dotnet seguido de la dll de su aplicación web. Esto equivale a ejecutar dotnet run en la raíz de su proyecto.

La siguiente línea (directory=) establece el directorio de trabajo como aquel en el que se encuentra el proyecto.

autostart=true significa que la aplicación se iniciará en el momento del inicio.

autorestart=true significa que la aplicación se reiniciará si se bloquea o incluso si se detiene (por ejemplo, usando kill). Si desea que su aplicación solo se reinicie en caso de un bloqueo, cámbiela a autorestart=unexpected.

Las dos líneas siguientes definen en qué archivos se escriben la salida estándar y la salida de error, respectivamente.

Finalmente environment nos permite establecer variables de entorno, en este caso estamos configurando ASPNETCORE_ENVIRONMENT=Production.

Para habilitar este nuevo archivo de configuración, ejecute los siguientes comandos:

$ sudo supervisorctl reread$ sudo supervisorctl update

Puede verificar el estado de los procesos que se ejecutan bajo supervisor ejecutando

$ sudo supervisorctl

Debería mostrar algo similar a:

aspnetcore EJECUTANDO pid 18817, tiempo de actividad 0:05:29
supervisor>

Hay más comandos que puede usar para administrar el procesos bajo supervisor, escriba help para obtener una lista de los comandos disponibles. Para salir, simplemente escriba quit.

Configurar HTTPS con IIS

El primer paso para habilitar HTTPS mientras se usa IIS es instalar nuestro certificado y clave privada (utilizando a .archivo pfx que contiene).

Abra el Administrador de IIS y seleccione Certificados de servidor

 Abra certificados de servidor en IIS

Haga clic en Importar certificado:

Importar certificado

Seleccione el .archivo pfx e ingrese la contraseña correspondiente, deje la tienda como Personal:

Seleccione pfx e ingrese la contraseña

Antes de continuar, es importante mencionar que necesita tener el ASP.NET Módulo Central instalado. Es muy probable que ya lo haga, ya que está instalado para usted cuando instala el SDK de.Net Core.

Sin embargo, en caso de que no lo sea (puede verificarlo en el Administrador de IIS abriendo Módulos y verificando si AspNetCoreModule aparece en la lista), puede encontrar instrucciones de instalación aquí y un enlace directo para descargar el módulo ASP.NET Paquete de alojamiento de Servidor Central aquí.

Lo que hace este módulo es iniciar su ASP.NET Sitio web principal y mantenerlo en funcionamiento (reiniciándolo si se bloquea). Este módulo también es responsable de reenviar las solicitudes HTTP a su aplicación web y, a continuación, reenviar las respuestas al cliente.

Una cosa importante que debe saber sobre AspNetCoreModule es que está configurado por el archivo web.config en la raíz de su proyecto. Necesita ejecutar dotnet publish en su proyecto para obtener web.config la configuración correcta en su carpeta de publicación.

El siguiente paso es crear un nuevo Grupo de aplicaciones y seleccionar Sin código administrado como la Versión CLR de. NET. Normalmente, los sitios web se ejecutan dentro de un proceso de trabajo de IIS, pero en. NET Core se ejecutan como un proceso separado, por lo que no hay necesidad de un tiempo de ejecución de. Net en el grupo de aplicaciones:

 Crear un nuevo grupo de aplicaciones

Finalmente, vamos a crear un nuevo sitio web dentro de IIS para nuestro ASP.NET Aplicación principal. Necesitamos seleccionar el grupo de aplicaciones que acabamos de crear, seleccionar como Ruta Física la ruta al sitio web publicado, seleccionar HTTPS como enlace y nuestro certificado en el menú desplegable Certificado SSL:

Crear nuevo sitio web

Ahora debería poder usar https para navegar a su ASP.NET Aplicación principal.

Es justo compartir…Compartir en Facebook

Facebook

Tweet acerca de esto en Twitter

Twitter

Compartir en LinkedIn

Linkedin

Deja una respuesta

Tu dirección de correo electrónico no será publicada.