Certificados autofirmados en Windows

Certificados autofirmados en Windows

Aprovisionar certificado raíz y certificados para web desde Windows con PowerShell.

Para poder usar HTTPS en sitios web locales (como localhost, o en una red interna) es necesario generar certificados autofirmados. Usar certificados de Let's Encrypt u otras autoridades de certificación no es posible porque los dominios no son públicos.

  1. Abrir PowerShell como Administrador para que se puedan añadir los certificados al almacén del sistema.

Certificado raíz

New-SelfSignedCertificate -FriendlyName CAMBIAME -DnsName "CAMBIAME" -KeyUsage CertSign,CRLSign -NotAfter (Get-Date).AddYears(3) -Subject "CN=CAMBIAME, O=MI ORGANIZACION, L=CIUDAD, S=PROVINCIA, C=PAIS" -TextExtension @("2.5.29.37={text}1.3.6.1.5.5.7.3.1")

Es necesario cambiar los campos FriendlyName por un nombre amigable para el certificado, como "Autofirmado Miorganizacion Root"; AddYears(3) por la cantidad de años que se quiera tener de vida del certificado raíz. Los campos de Subject se sustituyen por los que correspondan con la organización, aunque cualquier valor vale.

Certificados por sitios

Obtener el certificado raíz para que firme los otros

Ejecutar para listar todos los certificados y obtener la Thumbprint del raíz:

Get-ChildItem Microsoft.PowerShell.Security\Certificate::LocalMachine\MY

Obtener solo el certificado raíz:

$CertificadoRaiz = Get-ChildItem Microsoft.PowerShell.Security\Certificate::LocalMachine\MY\{MITHUMBPRINT}

Generar el certificado de sitio

New-SelfSignedCertificate -FriendlyName Sitio1Lan -KeyUsage DigitalSignature,KeyEncipherment -NotAfter (Get-Date).AddYears(1) -Subject "CN=sitio1.lan, OU=Sitio 1 Admins" -TextExtension @("2.5.29.17={text}DNS=sitio1.lan&IPAddress=192.168.14.3") -Signer $CertificadoRaiz

Hay que remplazar el AddYears(1) por la cantidad de años, nuevamente (aquí se recomienda menos tiempo que para el certificado raíz). También el FriendlyName conviene cambiarlo para identificar bien el sitio web que sea. CN debe ser el nombre de dominio a securizar, o dirección si se va a acceder solo via IP. Y luego cambiar las entradas DNS=sitio1.lan y IPAddress=192.168.14.3 por los valores correctos, añadiendo más o eliminándolos si no fueran necesarios.

Confiar en el certificado raíz y exportarlo

Antes de poder usar el certificado, debemos decirle a nuestro sistema que confíe en él. Para ello, abrimos certmgr.msc y vamos a Certificados -> Entidades de certificación intermedias -> Certificados y encontramos el que está emitido para el FriendlyName que le dimos al certificado raíz. Copiamos y pegamos en Entidades de certificación raíz -> Certificados, y confirmamos cuando lo pida.

Desde este mismo panel podemos hacer click derecho -> Todas las tareas -> Exportar y exportamos como .CER base64, para poder importar en otras máquinas y que confíen en nuestra CA para uso interno.

Uso con IIS

Abriendo el Administrador de IIS y yendo a "Certificados de servidor" en la página principal de la máquina, deberíamos encontrar nuestros dos certificados: tanto el raíz como el Web. Si no es así, tenemos que exportarlo del almacén con la clave pública y privada. Para dicha exportación, hay que ejecutar:

Get-ChildItem Microsoft.PowerShell.Security\Certificate::LocalMachine\MY\THUMBPRINTDEMICERTIFICADO | Export-PfxCertificate -FilePath C:\Users\MIUSUARIO\Desktop\miweb.pfx -Password (ConvertTo-SecureString -AsPlainText)

Pedirá introducir una contraseña, que debemos fijar nosotros, y que luego será necesaria al importar el certificado nuevamente. Una vez exportado, podemos importarlo a IIS desde el lateral derecho -> Importar, cubriendo los datos que nos pida.

Hecho esto, vamos al sitio para el que se creó el certificado y en el lateral derecho pulsamos "Enlaces...". En el panel pulsamos Agregar y cubrimos Tipo (HTTPS), nombre del host y seleccionamos en la parte inferior el certificado SSL a usar. Unos segundos después, deberíamos poder acceder vía HTTPS al sitio en cuestión y entrar sin problemas, como si se entrase a un sitio HTTPS de internet: sin alertas de seguridad ni problemas del estilo. Si no es así, probablemente sea necesario reiniciar el navegador o el equipo para que se recarguen los almacenes de certificados.