En mi último post te contaba cómo podías generar un certificado HTTPS válido para poder hacer desarrollo en local usando conexiones seguras (necesarias para usar ciertas APIs de HTML5), incluso simulando el dominio real que se usará en la aplicación final. El método vale para cualquier sistema operativo y genera certificados válidos solo para la máquina local, por lo que son perfectos para desarrollo. Ahora toca ver cómo montar ese certificado en tu servidor local de desarrollo. Cada uno tiene su método. Yo me voy a ocupar de IIS Express.

Si trabajas en Windows y con tecnologías Microsoft lo más probable es que para desarrollar utilices el servidor Web IIS Express. Éste viene incluido con Visual Studio, pero también te lo puedes descargar de manera individual desde el enlace anterior para poder usarlo manualmente. Yo, por ejemplo, lo uso mucho con Visual Studio Code y para ahorrarme escribir las instrucciones para lanzarlo en cada proyecto, hago uso de esta extensión de Warren Buckley.

IIS Express es una versión auto-contenida del servidor Web de Microsoft, Internet Information Server, que permite utilizarlo en local y trabajar en un entorno de ejecución idéntico al que tendrías en un servidor, incluso desde versiones cliente de Windows, como Windows 10. Ambos productos son virtualmente idénticos, salvo por cuestiones de licencias y modos de actualización, por lo que es una buena manera de desarrollar en local en un entorno muy parecido (casi idéntico) al que tendrás en producción. Las mayores diferencias son estas:

  • A priori IIS Express solo sirve páginas en local, no hacia otros equipos de la red, aunque existen maneras de saltarse esa restricción (y puedes usar ngrok para hacerlo muy fácil).
  • IIS Express no se ejecuta como un servicio, por lo que debes lanzarlo a mano cada vez que lo necesites.
  • IIS Express no tiene una interfaz visual de gestión como sí ocurre en el caso de su hermano mayor IIS. Como no hay "IIS Manager", debes gestionarlo todo de manera manual, lo cual implica normalmente una de dos cosas: o tocar directamente el archivo de configuración o utilizar algunas instrucciones específicas desde la línea de comandos.

Para el caso que nos ocupa, montar un certificado HTTPS para uso local, este último punto nos complica bastante la vida en IIS Express (en IIS convencional es muy sencillo y realmente no hay que hacer nada más que gestionarlo con un "applet" específico para certificados que hay en el IIS Manager). Otras tareas son mucho más simples, pero la de adjuntar un certificado para SSL / HTTPS en IIS Express es bastante complicado hasta que das con la manera de hacerlo, como veremos enseguida.

Una vez que sabes hacerlo es rápido de hacer, pero a mi me llevó en su día algunas horas de probar y pelearme con diversos comandos. La información disponible en la Red al respecto no es muy buena tampoco, por lo que espero que esto le pueda servir a más gente (y a mi mismo en el futuro, para no olvidarme).

¡Vamos allá!

1.- Instalar el certificado en el sistema

El primer paso tras haber generado el certificado es, obviamente, instalarlo en el sistema.

En Windows, el formato de certificado más sencillo de utilizar es el formato PKCS12. Ya hemos visto como se generan, así que asegúrate de que lo estás generando así, y que el archivo final tiene la extensión .p12:

Para instalarlo en el sistema solo tenemos que hacer doble-clic sobre ese archivo. Se abrirá un diálogo con un asistente y es prácticamente darle a "Siguiente" y poco más. Realmente lo único importante son dos cosas:

1.- Asociarlo a la máquina local y no al usuario actual:

2.- Que se nos pide la clave con la que está protegida la información del certificado, sin la cual no podremos instalarlo. Si lo has generado tal y como explico en el anterior artículo, la clave que debes utilizar es "changeit" (sin las comillas), como se ve en esta captura:

Una vez hecho esto el certificado estará instalado en el almacén de certificados de la máquina local y listo para ser utilizado por IIS Express.

2.- Configurar http.sys para usar el nuevo certificado

http.sys es el componente de núcleo de sistema de IIS. Es decir, es el componente de bajo nivel que se encarga de recibir y procesar en primera instancia todas las peticiones del protocolo HTTP (y HTTPS) que llegan a una máquina que tienen IIS funcionando. De hecho este componente es el que se utiliza en Windows desde la versión 2.2 de .NET Core para servir aplicaciones de ASP.NET Core en lugar de Kestrel, aumentando de paso mucho el rendimiento.

Bien, para que nuestro certificado pueda asociarse luego a IIS Express es necesario que primero lo tenga registrado y reconocido este componente.

Por defecto el http.sys de IIS Express trae configurados 100 puertos, del 44300 al 44399, para ser utilizados con HTTPS, para lo cual incluye su propio certificado SSL "falso". Al contrario que el nuestro, este certificado no es reconocido correctamente los navegadores, por lo que mostraría un mensaje de seguridad como el que mostré en el artículo anterior. Puedes comprobarlo de manera sencilla escribiendo la siguiente instrucción en la línea de comandos del sistema:

netsh http show sslcert

que mostrará todos los puertos que responden a HTTPS y los certificados que utilizan:

Como puedes observar en esta captura, todos los puertos (aquí solo se ven 2 de los 100) tienen asignado el mismo certificado, cuyo hash para identificarlo comienza por d54c0... que es el resumen digital del certificado "chungo" que nos ha instalado IIS Express.

Aunque, por supuesto, puedes utilizar el puerto estándar 443 para usar el certificado, yo suelo ceñirme a esos puertos del 44300 en adelante para evitar que si pones un servidor de desarrollo distinto en la misma máquina pueda haber interferencias, que es por lo mismo que ellos lo hacen así. Pero lo que voy a explicar ahora es válido también si quieres usar el puerto 443 u otro cualquiera.

Lo primero que debemos hacer es averiguar el resumen digital del certificado que hemos creado e instalado. Tenemos dos formas de conseguirlo:

1.- Ir a la gestión visual de certificados (abriendo mmc.exe y añadiendo el complemento de certificados para la máquina local) y verlo directamente en sus propiedades (propiedad Thumbprint):

2.- Usar Powershell para obtenerlo directamente, con un comando:

Get-ChildItem -path cert:\LocalMachine\My

que nos muestra los certificados actualmente instalados:

Normalmente verás 3 (si tienes el de IIS Express aún instalado) o bien 2 como en mi captura, que se corresponden respectivamente con el certificado para HTTPS y para firmar código u otros certificados. El que nos interesa es el primero que lo podemos reconocer porque su nombre común (propiedad CN) NO comienza con "mkcert" o, de hecho ni siquiera tiene el CN establecido (en la figura, el primero).

Si quieres tener la seguridad de cuál es o poder ver con detalle todas las propiedades puedes escribir:

Get-ChildItem -path cert:\LocalMachine\My -recurse | ForEach-Object{ $_.Subject }

que te mostrará la propiedad "Subject" con estos datos completos por pantalla:

Si quisieses ver con detalle todas las propiedades y no solo esta deberías crear un mini-script de Powershell un poco más complejo, en concreto este:

$certs=get-childitem cert:\localmachine\my -recurse | select * 
    foreach($cert in $certs){
        foreach($prop in $cert.psobject.properties){
            write-host "$($prop.name) - $($prop.Value)"
        }
    }

Pero si tienes que llegar a esto solo para un certificado es mejor que vayas directamente a la MMC. Aquí tienes una buena referencia de estos comandos.

Bien, volviendo al tema que nos ocupa, una vez que tienes el thumbprint del certificado, lo que debes hacer a continuación es asignarlo al puerto que te interese, en mi ejemplo el 44300.

Dado que yo ya tengo asignado ese puerto, por defecto, a otro certificado, antes de nada tengo que eliminarlo para lo cual debo escribir desde PowerShell (o desde la línea de comandos) como administrador:

netsh http delete sslcert ipport=0.0.0.0:44300

En tu caso si no está asignado o usas otro puerto que no esté asignado (como el 443) no es necesario que lo hagas.

Ahora debes añadir el certificado al puerto correspondiente, para lo cual la instrucción necesaria es:

netsh http add sslcert ipport=0.0.0.0:44300 certhash=XXXX appid='{214124cd-d05b-4309-9af9-9caa44b2b74a}'

siendo XXXX el thumbprint de tu certificado en letras minúsculas (esto es importante), que has averiguado hace un momento. El appid es el identificador de IIS Express, que en mi caso es ese que se ve en la línea anterior, pero que dependiendo de la versión que uses puede variar. Lo puedes ver en la salida de netsh http show sslcert que comentaba al principio en cualquiera de las entradas por defecto que mete IIS Express.

3.- Enlazar el puerto a tu aplicación web

Vale, ahora solo nos resta crear un sitio web en IIS que responda a las peticiones del puerto al que hemos asignado el certificado. Para ello debemos hacer 2 cosas:

3.1.- Agregar el certificado a IIS

Para lo cual nos movemos desde la línea de comandos a la carpeta de IIS Express (generalmente "C:\Program files\ IIS Express") y usamos el comando:

IisExpressAdminCmd.exe setupSslUrl -url:https://localhost:44300 -CertHash:XXXX

siendo XXXX el thumbprint de nuestro certificado (esta vez puede ir en mayúsculas como el original).

3.2.- Crear un nuevo sitio web que apunte a la carpeta apropiada

En este caso el comando a utilizar es:

appcmd.exe add site /name:"PruebaSSL" /bindings:https/*:44300:localhost /physicalpath:"C:\carpeta"

que creará un nuevo sitio web llamado "PruebaSSL" enlazado al puerto 44300 (o el que tú hayas querido utilizar) y que apuntará a la carpeta de disco que te interese para servir la aplicación o sitio web.

Con esto ya está todo listo y podrás lanzar tu nuevo sitio web con SSL simplemente escribiendo:

iisxpress /site:PruebaSSL

De modo que todo está ya funcionando y podrás ver tu sitio web en acción con HTTPS activado:

¡Espero que te resulte útil!

💪🏻 ¿Este post te ha ayudado?, ¿has aprendido algo nuevo?
Pues NO te pido que me invites a un café... Te pido algo más fácil y mucho mejor

Escrito por un humano, no por una IA