Windows31 de agosto de 2026 35 vistas

Instalar Let's Encrypt en IIS: HTTPS y renovación automática

Instalar Let's Encrypt en IIS: HTTPS y renovación automática

Esta guía explica cómo instalar un certificado TLS de Let's Encrypt en un sitio IIS alojado en un VPS Windows Server. El procedimiento principal utiliza simple-acme. Cubre la validación HTTP-01, los certificados wildcard mediante DNS-01, los enlaces de IIS con SNI, la renovación programada, HSTS, la supervisión y los errores más frecuentes.

El resultado esperado es el siguiente:

  • http://example.com responde en el puerto 80 y redirige a HTTPS;
  • https://example.com y https://www.example.com presentan un certificado válido;
  • el certificado contiene los nombres DNS correctos en sus SAN;
  • IIS usa el enlace correcto en el puerto 443;
  • una tarea programada comprueba a diario si hace falta renovar;
  • la próxima renovación puede completarse sin intervención humana.

Método, alcance y límites de esta guía

La información se contrastó el 29 de agosto de 2026 con la documentación oficial de Let's Encrypt, de Microsoft IIS y de simple-acme. Los comandos se compararon con las referencias de PowerShell e IIS publicadas por Microsoft.

Las versiones, los límites de emisión y las duraciones de validez cambian con regularidad. Antes de aplicar este procedimiento en producción, reprodúzcalo en un VPS de preproducción con un subdominio real y compruebe las cifras de este artículo en las páginas oficiales enlazadas a lo largo del texto.

Esta guía trata de un sitio IIS público asociado a un nombre DNS. No cubre certificados de controlador de dominio, LDAPS o AD CS, ni Exchange, RDS Gateway o SQL Server, ni una PKI interna, ni un clúster IIS sin despliegue centralizado de certificados, ni un proxy que termine TLS en otra máquina. En esos casos el certificado puede seguir viniendo de una autoridad ACME, pero el método de instalación y renovación debe adaptarse al servicio.

Let's Encrypt, ACME, IIS y simple-acme: ¿quién hace qué?

ComponenteFunción
Let's Encryptautoridad de certificación pública que valida el control del nombre y firma el certificado
ACME v2protocolo que automatiza la validación, la emisión, la renovación y la revocación
simple-acmecliente ACME de terceros que dialoga con Let's Encrypt y gobierna IIS
Almacén de certificados de Windowsguarda el certificado y su clave privada en el servidor
IIS y HTTP.sysasocian el certificado a una dirección, un puerto y un nombre de host
Tarea programada de Windowsejecuta simple-acme con regularidad para comprobar las renovaciones

Let's Encrypt emite certificados de validación de dominio. Demuestran el control técnico de los nombres solicitados y cifran la conexión. No certifican la identidad jurídica de una empresa y no corrigen ni una aplicación vulnerable ni un servidor comprometido. Let's Encrypt no ofrece certificados OV ni EV, como indica su FAQ oficial.

Los certificados públicos también se inscriben en registros de Certificate Transparency. Los nombres DNS presentes en el certificado no deben considerarse secretos. Let's Encrypt explica este funcionamiento en su documentación sobre los registros CT.

simple-acme o win-acme: ¿cuál elegir?

win-acme sigue siendo el cliente más conocido del ecosistema IIS. simple-acme se presenta en su propio sitio como un reemplazo retrocompatible, desarrollado por la misma persona. A 29 de agosto de 2026, simple-acme publica la versión 2.4.0 mientras win-acme sigue distribuyendo su 2.2.9.1: ambos proyectos están disponibles, y pasar de uno a otro es una elección, no una obligación.

Esta guía usa simple-acme porque es la rama actualizada más recientemente. Si ya explota win-acme y renueva correctamente sus certificados, nada le obliga a migrar con prisas.

La documentación de primeros pasos confirma que la herramienta detecta los enlaces de IIS, usa Let's Encrypt por defecto, efectúa una validación HTTP, instala el certificado en el almacén de Windows, crea o actualiza los enlaces HTTPS y crea una tarea programada de renovación.

simple-acme no es un producto de Microsoft ni un «cliente oficial de Let's Encrypt». Es software libre de terceros. Descárguelo únicamente desde el sitio de simple-acme o su repositorio de GitHub enlazado, y verifique después la integridad del archivo.

Si ya utiliza win-acme

No elimine a ciegas win-acme ni su carpeta en %ProgramData%. Empiece por un inventario:

Get-ScheduledTask |
    Where-Object TaskName -Match "win-acme|simple-acme" |
    Select-Object TaskName, State, TaskPath

Inventaríe después las renovaciones y la ubicación de su configuración. simple-acme se anuncia como un reemplazo compatible, pero una migración de servidor o de contexto DPAPI exige comprobar secretos, rutas, plugins y certificados. Siga el procedimiento de migración de simple-acme y conserve una copia de seguridad antes de cualquier cambio.

Entender HTTP-01, DNS-01 y TLS-ALPN-01

Let's Encrypt debe verificar que usted controla cada nombre solicitado.

MétodoValidaciónPuerto o servicio necesarioWildcardUso recomendado
HTTP-01recurso bajo /.well-known/acme-challenge/TCP 80 públiconoun sitio IIS público en un solo servidor
DNS-01registro TXT bajo _acme-challengeAPI DNS públicawildcard, clúster, puerto 80 no disponible
TLS-ALPN-01respuesta TLS específicaTCP 443 públiconoinfraestructuras TLS avanzadas

Para HTTP-01, Let's Encrypt solicita un recurso con esta forma:

http://example.com/.well-known/acme-challenge/<TOKEN>

La validación llega obligatoriamente al puerto 80. Let's Encrypt puede seguir hasta diez redirecciones, pero solo hacia HTTP o HTTPS y hacia los puertos 80 o 443. HTTP-01 no permite obtener *.example.com. Estas reglas se describen en la página oficial Challenge Types.

Para DNS-01, el cliente publica un TXT bajo:

_acme-challenge.example.com

DNS-01 admite wildcards y funciona sin servidor web público. Para seguir siendo automatizable, necesita una API DNS o delegar _acme-challenge hacia una zona que pueda automatizarse. Use credenciales de API con privilegios reducidos: dar al servidor web una clave capaz de modificar todas sus zonas DNS aumenta mucho el impacto de un compromiso.

Requisitos previos

Necesita un VPS Windows Server actualizado, acceso de administrador por RDP o consola, IIS instalado con un sitio que ya responda por HTTP, un dominio o subdominio público bajo su control, un registro A y, si existe, un AAAA correcto, los puertos TCP 80 y 443 abiertos en el firewall de Windows y en el firewall de red, conectividad saliente HTTPS hacia la API ACME, una dirección de correo de explotación supervisada y una copia de seguridad de la configuración de IIS antes de modificarla.

Nuestros VPS Windows ofrecen un entorno Windows administrable con acceso de administrador completo. Dado que las versiones, los recursos y las opciones pueden cambiar, consulte la página de producto en el momento del despliegue.

1. Auditar Windows Server e IIS

Abra Windows PowerShell como administrador:

Get-ComputerInfo |
    Select-Object WindowsProductName, WindowsVersion, OsBuildNumber

Get-WindowsFeature Web-Server
Get-Service W3SVC

Get-NetFirewallProfile |
    Select-Object Name, Enabled, DefaultInboundAction, DefaultOutboundAction

El rol Web-Server debe estar instalado y el servicio W3SVC en ejecución. Si IIS aún no está instalado:

Install-WindowsFeature Web-Server -IncludeManagementTools

Install-WindowsFeature exige una consola elevada y -IncludeManagementTools instala las herramientas de administración, conforme a la referencia de Windows Server 2025. Si parte de un servidor nuevo, nuestra guía de primeros pasos con un VPS Windows cubre la conexión inicial y las actualizaciones.

Inventaríe los sitios y sus enlaces:

Import-Module WebAdministration

Get-Website |
    Select-Object Name, Id, State, PhysicalPath

Get-WebBinding |
    Select-Object protocol, bindingInformation, sslFlags

Anote el nombre y el ID del sitio que va a proteger. Los ejemplos siguientes usan:

ParámetroEjemplo
Sitio IISMiSitio
ID de IIS2
Dominio principalexample.com
Aliaswww.example.com
IPv4 pública203.0.113.10, valor documental que debe sustituir

Los rangos 192.0.2.0/24, 198.51.100.0/24 y 203.0.113.0/24 están reservados a la documentación. No los copie en una configuración real.

Añadir los enlaces HTTP que falten

simple-acme puede deducir los nombres a partir de los enlaces de IIS. Cada nombre solicitado debe ser explícito y apuntar realmente a este servidor.

New-WebBinding `
    -Name "MiSitio" `
    -Protocol "http" `
    -IPAddress "*" `
    -Port 80 `
    -HostHeader "example.com"

New-WebBinding `
    -Name "MiSitio" `
    -Protocol "http" `
    -IPAddress "*" `
    -Port 80 `
    -HostHeader "www.example.com"

Ejecute estos comandos solo si los enlaces no existen ya. Microsoft documenta New-WebBinding y sus parámetros en la referencia de WebAdministration.

Compruebe el resultado:

Get-WebBinding -Name "MiSitio" -Protocol http |
    Select-Object bindingInformation

Un enlace vacío del tipo *:80: acepta todos los nombres que ningún otro sitio capture. Puede ocultar un error de configuración y hacer que se valide el contenido equivocado. En un servidor con varios sitios, use nombres de host precisos.

2. Verificar el DNS público, incluido IPv6

Desde el VPS:

Resolve-DnsName example.com -Type A
Resolve-DnsName www.example.com -Type A

Resolve-DnsName example.com -Type AAAA -ErrorAction SilentlyContinue
Resolve-DnsName www.example.com -Type AAAA -ErrorAction SilentlyContinue

Las respuestas A deben corresponder a la IPv4 pública que sirve IIS. Si existe un AAAA, el sitio también debe funcionar en esa IPv6.

Let's Encrypt prefiere IPv6 en el primer intento si hay un registro AAAA publicado. Un servidor IPv6 que responda con el contenido equivocado puede hacer fracasar la validación sin recurrir a IPv4. La corrección consiste en apuntar AAAA al servidor correcto y servir el mismo sitio, o en eliminar AAAA si no usa IPv6. No existe ninguna opción para pedir a Let's Encrypt que prefiera IPv4. Consulte la documentación IPv6 Support.

Compruebe también las posibles reglas CAA:

Resolve-DnsName example.com -Type CAA -ErrorAction SilentlyContinue

La ausencia de CAA no impide la emisión. Si existe una política CAA, debe autorizar a Let's Encrypt, por ejemplo:

example.com.  CAA 0 issue "letsencrypt.org"

Para controlar los wildcards por separado puede usarse la etiqueta issuewild. El identificador CAA de Let's Encrypt es letsencrypt.org, como indica su documentación de CAA. Un error SERVFAIL puede señalar una cadena DNSSEC incorrecta o un servidor DNS defectuoso.

3. Abrir únicamente los puertos necesarios

Cree reglas de entrada para HTTP y HTTPS:

New-NetFirewallRule `
    -DisplayName "IIS HTTP - TCP 80" `
    -Direction Inbound `
    -Protocol TCP `
    -LocalPort 80 `
    -Action Allow `
    -Profile Any

New-NetFirewallRule `
    -DisplayName "IIS HTTPS - TCP 443" `
    -Direction Inbound `
    -Protocol TCP `
    -LocalPort 443 `
    -Action Allow `
    -Profile Any

Si estas reglas ya existen, audítelas en lugar de crear duplicados:

Get-NetFirewallRule -DisplayName "IIS HTTP - TCP 80","IIS HTTPS - TCP 443" |
    Get-NetFirewallPortFilter

El firewall de Windows y el firewall de red del proveedor son dos capas distintas. Una regla local correcta no basta si el filtrado previo rechaza el puerto. Nuestra guía para configurar el firewall de Windows Server en un VPS detalla esa separación.

Para HTTP-01, el puerto 80 debe ser accesible desde Internet. Let's Encrypt no publica un rango estable de direcciones de validación que autorizar: restringir el acceso a unas pocas IP arbitrarias acabará provocando un fallo.

Compruebe la escucha local:

Get-NetTCPConnection -State Listen |
    Where-Object LocalPort -In 80,443 |
    Select-Object LocalAddress, LocalPort, OwningProcess

Después pruebe desde una conexión exterior al VPS:

Test-NetConnection example.com -Port 80
Test-NetConnection example.com -Port 443

Una prueba realizada desde el propio servidor no siempre demuestra la accesibilidad pública, sobre todo si hay NAT, proxy o filtrado geográfico.

4. Guardar la configuración de IIS

Antes de modificar los enlaces:

$appcmd = "$env:windir\System32\inetsrv\appcmd.exe"
& $appcmd add backup "Antes-LetsEncrypt"
& $appcmd list backup

Esta copia protege la configuración de IIS, no el contenido del sitio, la base de datos ni los secretos de la aplicación. Conserve además una copia del sistema según su política. Nuestra guía sobre cómo respaldar un VPS Windows presenta varios enfoques.

5. Descargar y verificar simple-acme

Método recomendado en Windows Server 2019 y 2022: el archivo oficial

Descargue la compilación Windows x64 desde la página oficial de simple-acme. Elija:

  • la versión trimmed para HTTP-01 y un IIS sencillo: es más ligera pero no admite plugins;
  • la versión full si necesita plugins externos, en particular para un proveedor DNS.

Descomprima el archivo en una ubicación permanente:

C:\Program Files\simple-acme

No deje wacs.exe en Descargas ni en una carpeta temporal. La tarea programada depende de la ruta del ejecutable.

Calcule el SHA-256 del archivo antes de extraerlo:

Get-FileHash `
    -Path "C:\Users\Administrator\Downloads\simple-acme.zip" `
    -Algorithm SHA256

Compare el valor, carácter por carácter, con el hash publicado en la página de descarga. A 29 de agosto de 2026, la página oficial indica la versión 2.4.0, compilación 2.4.0.2350. No fije ese hash en un procedimiento destinado a durar: cambia con cada versión.

Método en Windows Server 2025: WinGet

La documentación de simple-acme indica que WinGet está disponible en Windows Server 2025:

winget install simple-acme

Compruebe después la ruta realmente instalada:

Get-Command wacs.exe -ErrorAction SilentlyContinue

En Server 2019 o 2022, prefiera el archivo oficial, salvo que WinGet se haya instalado y se gestione explícitamente en su imagen.

Verificar el ejecutable

Set-Location "C:\Program Files\simple-acme"
.\wacs.exe --version

Ejecute siempre la primera configuración desde una consola de administrador. La documentación de instalación de simple-acme precisa que se necesitan privilegios elevados para gestionar IIS, crear la tarea programada y atender las solicitudes de validación.

6. Probar en staging antes de producción

Let's Encrypt recomienda su entorno de staging para las pruebas. Sus certificados no son de confianza para los navegadores, pero los límites se adaptan mucho mejor a la depuración. La URL ACME v2 de prueba está publicada en la documentación de staging.

Desde la carpeta de simple-acme:

.\wacs.exe --test --verbose

Elija el mismo sitio y los mismos nombres que para producción. Un certificado de staging provocará una advertencia de confianza en el navegador: es normal.

Después de la prueba:

  1. abra Manage renewals en simple-acme;
  2. identifique la renovación asociada al servidor de staging;
  3. anúlela si ya no la necesita;
  4. ejecute después el procedimiento de producción;
  5. compruebe que hay una tarea de producción y el enlace de IIS correcto activos.

Evite usar --nocache y --force de forma repetida. A 29 de agosto de 2026, Let's Encrypt documenta en particular 50 certificados nuevos por dominio registrado cada 7 días, 5 certificados por conjunto exacto de identificadores cada 7 días y 5 fallos de autorización por identificador y cuenta cada hora. Las renovaciones coordinadas mediante ARI están exentas de esos límites. Consulte siempre la página Rate Limits al diagnosticar, porque estos valores cambian.

7. Emitir el certificado con el asistente interactivo

Ejecute:

Set-Location "C:\Program Files\simple-acme"
.\wacs.exe

Para un sitio IIS clásico:

  1. elija N: Create certificate (default settings);
  2. seleccione el sitio IIS MiSitio;
  3. seleccione únicamente example.com y www.example.com;
  4. compruebe que no se incluye ningún nombre interno, alias antiguo o entorno de prueba;
  5. acepte las condiciones del servicio ACME;
  6. indique una dirección de correo de explotación;
  7. deje HTTP-01 y el módulo self-hosting predeterminado;
  8. deje la instalación en el almacén de Windows y los enlaces de IIS.

Las letras y las etiquetas pueden cambiar ligeramente entre versiones. Guíese por el sentido de cada opción y por la documentación de la versión instalada, no por una captura antigua.

El plugin self-hosting de simple-acme inicia temporalmente un servicio de escucha en memoria. Puede compartir el puerto 80 con IIS y HTTP.sys. Aun así, el puerto sigue siendo necesario desde el exterior. Consulte la documentación de Self-hosting.

Al final, simple-acme debe validar cada nombre, solicitar el certificado a Let's Encrypt, colocar el certificado y su clave en el almacén de Windows, crear o actualizar los enlaces HTTPS correspondientes, guardar los parámetros de la renovación y crear la tarea programada diaria.

8. Variante totalmente automatizada en línea de comandos

Empiece por confirmar el ID de IIS:

Get-Website -Name "MiSitio" |
    Select-Object Name, Id

Después adapte este comando:

.\wacs.exe `
    --source iis `
    --siteid 2 `
    --host example.com,www.example.com `
    --validation selfhosting `
    --installation iis `
    --emailaddress [email protected] `
    --accepttos

--source iis activa el modo no interactivo. --siteid limita la fuente al sitio correcto y --host filtra los enlaces con precisión. Estos parámetros están documentados en la fuente IIS de simple-acme y en la referencia de la CLI.

Antes de integrar este comando en una herramienta de despliegue, sustituya cada valor de ejemplo, ejecútelo primero con --test --verbose, no pase ningún secreto DNS en claro por el historial de PowerShell, conserve una salida de registro y use la opción L del gestor de renovaciones para obtener la línea equivalente a una configuración creada manualmente.

La línea de comandos crea una renovación nueva. Para modificar una renovación existente, use el gestor interactivo; añadir parámetros nuevos a --renew no reconfigura el objeto existente.

9. Verificar el certificado y los enlaces de IIS

Comprobar los enlaces

Get-WebBinding -Name "MiSitio" |
    Select-Object protocol, bindingInformation, sslFlags,
                  certificateHash, certificateStoreName

Debe encontrar un enlace HTTPS por cada nombre:

*:443:example.com
*:443:www.example.com

En un VPS que aloja varios sitios sobre la misma IPv4 y el mismo puerto 443, los enlaces deben usar SNI. En New-WebBinding, el valor SslFlags = 1 designa un enlace SNI; Microsoft documenta los valores 0 a 3 en la referencia New-WebBinding.

Comprobar el certificado en los almacenes de Windows

$domain = "example.com"
$stores = @(
    "Cert:\LocalMachine\WebHosting",
    "Cert:\LocalMachine\My"
)

Get-ChildItem $stores -ErrorAction SilentlyContinue |
    Where-Object {
        ($_.DnsNameList | ForEach-Object Unicode) -contains $domain
    } |
    Sort-Object NotAfter -Descending |
    Select-Object Subject, Issuer, Thumbprint,
                  NotBefore, NotAfter, HasPrivateKey

Compruebe que Issuer corresponde a la cadena de Let's Encrypt esperada, que HasPrivateKey vale True, que NotAfter está en el futuro, que DnsNameList contiene todos los nombres usados y que la huella coincide con el enlace HTTPS.

Algunos perfiles modernos pueden no rellenar el Common Name. El campo determinante para los nombres es el Subject Alternative Name; no base la auditoría solo en Subject.

Comprobar HTTP.sys

netsh http show sslcert

Microsoft recomienda comparar el enlace de ApplicationHost.config con el almacén SSL de HTTP.sys durante un incidente. Consulte How to Set Up SSL on IIS y la referencia netsh http.

Comprobar desde el exterior

Desde otra red:

curl.exe -I http://example.com/
curl.exe -I https://example.com/
curl.exe -I https://www.example.com/

Una vez configurada la redirección, la primera llamada debe devolver un 301 o 308 hacia HTTPS. Las llamadas HTTPS deben responder sin error de nombre ni de cadena.

Pruebe también con un navegador sin sesión previa, con un teléfono en 4G o 5G, en IPv4 e IPv6 si existe AAAA, con un analizador TLS externo reconocido, y en las páginas con imágenes, scripts y hojas de estilo para detectar contenido mixto HTTP.

10. Configurar la redirección de HTTP a HTTPS

Active la redirección solo después de validar el certificado en cada nombre.

IIS 10 versión 1709 y posteriores disponen de un mecanismo HSTS nativo a nivel de sitio, con redirección de HTTP a HTTPS. Microsoft precisa que el destino usa el puerto estándar 443. Ejecute:

$appcmd = "$env:windir\System32\inetsrv\appcmd.exe"

& $appcmd set config `
    -section:system.applicationHost/sites `
    "/[name='MiSitio'].hsts.enabled:True" `
    /commit:apphost

& $appcmd set config `
    -section:system.applicationHost/sites `
    "/[name='MiSitio'].hsts.max-age:300" `
    /commit:apphost

& $appcmd set config `
    -section:system.applicationHost/sites `
    "/[name='MiSitio'].hsts.includeSubDomains:False" `
    /commit:apphost

& $appcmd set config `
    -section:system.applicationHost/sites `
    "/[name='MiSitio'].hsts.redirectHttpToHttps:True" `
    /commit:apphost

Los atributos y esta sintaxis de appcmd están publicados en la referencia de Microsoft HSTS settings for a Web Site.

Empiece con max-age=300 durante la validación funcional. Cuando haya observado HTTPS y la renovación, pase a 60 días, es decir 5184000 segundos, vigile los errores de certificado y los subdominios, y suba después a un año, 31536000, si la política de su organización lo prevé.

Para modificar la duración:

& $appcmd set config `
    -section:system.applicationHost/sites `
    "/[name='MiSitio'].hsts.max-age:5184000" `
    /commit:apphost

Active includeSubDomains únicamente si todos los subdominios funcionan de forma duradera por HTTPS. No active la precarga HSTS solo para mejorar una puntuación: la inscripción en la lista preload es un compromiso aparte y difícil de anular con rapidez.

HSTS convierte los errores de certificado en fallos que no se pueden esquivar en los navegadores que hayan memorizado la política. Let's Encrypt recomienda un despliegue prudente y advierte de ese riesgo en su Integration Guide.

¿Debe seguir abierto el puerto 80 tras la redirección?

Sí, si la renovación usa HTTP-01. El puerto 80 puede servir solo para la redirección y para /.well-known/acme-challenge/, pero debe seguir siendo accesible públicamente en las futuras validaciones. Let's Encrypt sabe seguir una redirección válida hacia 443, y el servicio de escucha self-hosting de simple-acme puede compartir el puerto con IIS.

Si su política exige cerrar el 80 de forma permanente, reconfigure antes la renovación en DNS-01 o en otro método compatible. No cierre el puerto para descubrir al expirar que la renovación está rota.

11. Verificar y supervisar la renovación automática

simple-acme crea una tarea programada tras el primer certificado correcto. Por defecto se ejecuta a diario con la cuenta SYSTEM, a una hora elegida al azar entre las 9 y las 11 de la mañana para repartir la carga. Solo renueva cuando alguna condición lo exige, en particular la duración restante del certificado, un cambio de nombres, una revocación, una instalación incompleta o una recomendación ARI. Consulte Automatic renewal.

Liste la tarea:

Get-ScheduledTask |
    Where-Object TaskName -Match "simple-acme|win-acme" |
    Select-Object TaskName, State, TaskPath

Muestre su estado:

$task = Get-ScheduledTask |
    Where-Object TaskName -Match "simple-acme" |
    Select-Object -First 1

if ($task) {
    Get-ScheduledTaskInfo `
        -TaskName $task.TaskName `
        -TaskPath $task.TaskPath
}

Compruebe LastTaskResult, LastRunTime y NextRunTime. La tarea debe seguir habilitada y apuntar a la carpeta permanente de simple-acme.

Probar sin provocar emisiones repetidas

Una comprobación normal no fuerza un certificado nuevo:

.\wacs.exe --renew --verbose

Este comando solo renueva los objetos que han entrado en su ventana. Para una prueba puntual de todo el proceso, la documentación propone:

.\wacs.exe --renew --force --verbose

No ejecute --force en bucle ni añada --nocache sin motivo. Use el staging para la depuración repetitiva. La caché protege parcialmente frente a los límites, pero no sustituye a un método de diagnóstico.

Consultar los registros

Los registros se encuentran normalmente en:

%ProgramData%\simple-acme\<servidor-acme>\Log

Para localizar los archivos recientes:

Get-ChildItem "$env:ProgramData\simple-acme" -Recurse -File |
    Where-Object Extension -In ".log",".txt" |
    Sort-Object LastWriteTime -Descending |
    Select-Object -First 20 FullName, LastWriteTime, Length

Consulte también el Visor de eventos de Windows. simple-acme conserva sus registros 120 días por defecto y puede enviar notificaciones si hay un servidor SMTP configurado.

Avisar de una expiración próxima

Esta comprobación local puede integrarse en su supervisión:

$warningDate = (Get-Date).AddDays(21)

$expiring = Get-ChildItem `
    "Cert:\LocalMachine\WebHosting",
    "Cert:\LocalMachine\My" `
    -ErrorAction SilentlyContinue |
    Where-Object {
        $_.HasPrivateKey -and
        $_.NotAfter -lt $warningDate -and
        $_.NotAfter -gt (Get-Date)
    } |
    Sort-Object NotAfter |
    Select-Object Subject, Thumbprint, NotAfter

$expiring

Vigile la fecha que se presenta al cliente remoto, no solo los certificados almacenados localmente. Un certificado antiguo puede seguir sirviéndose si no se actualizó el enlace de IIS o el proxy.

A 29 de agosto de 2026, los certificados de Let's Encrypt son válidos 90 días por defecto y la gran mayoría de los que emite usa esa duración. Hay disponible de forma opcional un perfil corto de unos 6 días para todos los suscriptores. Let's Encrypt anuncia además que reducirá la duración máxima de sus certificados a 45 días antes de febrero de 2028, y las reglas del sector limitarán las duraciones a un máximo de 47 días a partir del 15 de marzo de 2029. La página oficial sobre la duración de los certificados muestra por qué es imprescindible una automatización supervisada.

12. Certificado wildcard con DNS-01

Para *.example.com, HTTP-01 no funciona. Vuelva a ejecutar simple-acme y elija M: full options:

  1. fuente: enlaces de IIS o nombres introducidos manualmente;
  2. nombres: example.com y *.example.com si hacen falta ambos;
  3. validación: DNS-01;
  4. plugin: el de su proveedor DNS;
  5. clave: RSA o EC según su política y sus clientes;
  6. almacenamiento: almacén de certificados de Windows;
  7. instalación: enlaces de IIS.

El wildcard *.example.com cubre www.example.com o app.example.com, pero no el dominio a secas example.com ni a.b.example.com. Solicite explícitamente el dominio a secas si debe quedar cubierto.

La versión full de simple-acme es necesaria para cargar plugins externos, ya que la versión trimmed no los admite. Los plugins se instalan en %ProgramData%\simple-acme\plugins. La lista actual figura en la documentación de validación DNS.

Seguridad de las credenciales DNS

  • cree un token dedicado a la validación ACME;
  • limítelo a las zonas y acciones estrictamente necesarias;
  • use el almacén de secretos de simple-acme en lugar de un argumento en claro;
  • proteja la carpeta %ProgramData%\simple-acme;
  • prevea la rotación y la revocación del token;
  • no use una clave global de cuenta si existe un token limitado.

Si su proveedor DNS no ofrece una API adecuada, delegue _acme-challenge.example.com mediante CNAME o NS hacia una zona de validación automatizable. Esto evita a veces dar al servidor web acceso a toda la zona principal.

13. Endurecer TLS sin romper Windows

El certificado no elige por sí solo las versiones de TLS ni los conjuntos de cifrado. IIS se apoya en Schannel, así que la configuración se define en gran medida a nivel de sistema.

Inventaríe los conjuntos:

Get-TlsCipherSuite |
    Select-Object Name, Cipher, Hash, Exchange

Microsoft recomienda a las aplicaciones usar los valores predeterminados del sistema en lugar de imponer arbitrariamente sus propias versiones de protocolo. La documentación TLS registry settings recuerda además que un cambio en Schannel afecta a otros servicios además del sitio IIS.

Puntos de control: instale las actualizaciones de Windows, mantenga TLS 1.2 por compatibilidad, tenga en cuenta que TLS 1.3 se admite a partir de Windows Server 2022, desactive los protocolos heredados solo tras inventariar sus clientes, pruebe la aplicación, las API, los agentes de supervisión y los clientes antiguos, guarde los parámetros antes de cualquier cambio y evite copiar un script del registro sin versionar encontrado en un blog.

La matriz de compatibilidad está publicada en Protocols in TLS/SSL (Schannel SSP). Una política demasiado estricta también puede impedir que el cliente ACME alcance la API.

14. Resolución de problemas: síntomas, causas y acciones

SíntomaCausa probableComprobaciónCorrección
connection timed out en HTTP-01puerto 80 filtrado aguas arribaprueba externa de TCP 80abrir el firewall de Windows y el de red
unauthorized con 404servidor o enlace equivocadoDNS, registros de IIS, enlacescorregir A/AAAA y el encabezado de host
la validación intenta una IPv6 equivocadaAAAA antiguo o incoherenteResolve-DnsName -Type AAAAcorregir o retirar AAAA
CAA forbids issuanceCAA no autoriza a Let's EncryptResolve-DnsName -Type CAAautorizar letsencrypt.org si es conforme a la política
SERVFAIL de DNSDNSSEC o DNS autoritativo rotoconsultas a cada NSreparar DNSSEC o el servidor DNS
el servicio de escucha self-hosting no arrancareserva de URL o software incompatiblenetsh http show urlaclcorregir la reserva o usar filesystem/DNS-01
se sirve el certificado equivocadoenlace SNI o huella incorrectosGet-WebBinding, netsh http show sslcertcorregir el encabezado de host, SNI y el certificado
el navegador señala contenido mixtorecursos aún cargados por HTTPconsola de desarrolladorconvertir a HTTPS las URL de los recursos
falta la renovacióntarea eliminada o ruta movidaProgramador de tareasvolver a crear la tarea desde simple-acme
la renovación funciona pero se sirve el certificado antiguopaso de IIS no instalado o proxy intermedioenlace de IIS y prueba remotareconfigurar la instalación, actualizar el terminador TLS
demasiadas solicitudespruebas realizadas en producciónregistro ACME y encabezado Retry-Afteresperar, respetar Retry-After y usar staging

Probar la ruta HTTP-01

La validación predeterminada se gestiona en memoria mientras se ejecuta simple-acme. Para diagnosticar una ruta o un proxy, puede no obstante comprobar que ninguna regla bloquea el prefijo:

curl.exe -I http://example.com/.well-known/acme-challenge/test

Un 404 fuera de una validación es normal; un rechazo de red, una autenticación obligatoria, un bloqueo del WAF o una redirección hacia un puerto poco habitual no lo son. Durante una validación real con --test --verbose, observe la respuesta detallada y los registros.

Identificar el proceso asociado al puerto 80

$connection = Get-NetTCPConnection -LocalPort 80 -State Listen |
    Select-Object -First 1

if ($connection) {
    Get-Process -Id $connection.OwningProcess
}

netsh http show urlacl

El proceso System es habitual con HTTP.sys e IIS; no significa automáticamente que haya software malicioso ocupando el puerto.

Diagnosticar un certificado SNI incorrecto

Muestre los enlaces HTTPS:

Get-WebBinding -Protocol https |
    Select-Object ItemXPath, bindingInformation, sslFlags,
                  certificateHash, certificateStoreName

Cuando varios sitios comparten *:443, cada nombre debe tener su propio enlace y SNI debe estar activo. El enlace vacío *:443: puede convertirse en el enlace predeterminado para clientes sin SNI y servir un certificado inesperado.

15. Mantenimiento, actualización y respuesta ante incidentes

Actualizar simple-acme

En Windows Server 2025 con WinGet:

winget upgrade simple-acme

Para una instalación manual, descargue el nuevo archivo oficial, verifique el hash, guarde la carpeta y sustituya los archivos del programa. Las renovaciones se almacenan aparte en %ProgramData% y deben conservarse. Tras la actualización:

.\wacs.exe --version
.\wacs.exe --list
.\wacs.exe --renew --verbose

Lea siempre las notas de versión antes de un cambio de rama importante.

En caso de fuga de la clave privada

  1. aísle y analice el servidor comprometido;
  2. revoque el certificado;
  3. corrija la causa de la fuga;
  4. genere una clave nueva y un certificado nuevo;
  5. sustituya todos los enlaces afectados;
  6. busque otros certificados o secretos expuestos;
  7. documente el incidente.

En simple-acme, la revocación está disponible en Manage renewals > Revoke certificate o mediante --revoke con el identificador de la renovación. Let's Encrypt indica que la revocación es obligatoria cuando una clave privada queda comprometida y describe los motivos aceptados en Revoking Certificates.

Anular una renovación no es lo mismo que revocar un certificado. La anulación detiene la gestión futura; la revocación señala que un certificado ya emitido no debe seguir siendo de confianza.

Lista de comprobación para la puesta en producción

  • Windows Server e IIS están actualizados.
  • El sitio IIS tiene encabezados de host explícitos.
  • A apunta a la IPv4 pública correcta.
  • Todo AAAA publicado sirve correctamente el mismo sitio.
  • Los puertos 80 y 443 son accesibles desde el exterior.
  • La configuración de IIS se ha guardado.
  • simple-acme procede de la fuente oficial y se verificó su hash.
  • Se usó staging para la depuración inicial.
  • El certificado contiene todos los SAN esperados.
  • Los enlaces HTTPS usan SNI si la IP está compartida.
  • HTTP redirige a HTTPS sin bucle.
  • HSTS se desplegó de forma progresiva.
  • La tarea programada existe, está habilitada y ya ha funcionado.
  • Los registros y la expiración están supervisados.
  • El método de validación seguirá disponible en la próxima renovación.
  • Existe un procedimiento de revocación y recuperación.

Preguntas frecuentes

¿Let's Encrypt es realmente gratuito en IIS?

Sí. Let's Encrypt no cobra por emitir sus certificados DV. El VPS Windows, el nombre de dominio, la administración y los posibles servicios DNS siguen siendo de pago según sus proveedores.

¿El certificado dura 90 días?

A 29 de agosto de 2026 el perfil clásico sigue siendo válido 90 días por defecto. Existe de forma opcional un perfil corto de unos 6 días, y Let's Encrypt prevé rebajar su duración máxima a 45 días antes de febrero de 2028. No conciba nunca una explotación en torno a una renovación manual trimestral.

¿El puerto 80 es obligatorio?

Es obligatorio para HTTP-01, aunque el servicio de escucha interno use otro puerto tras una redirección o un NAT. No hace falta para DNS-01. TLS-ALPN-01 usa el 443, pero conviene sobre todo a infraestructuras avanzadas.

¿Se puede cerrar el puerto 80 tras la instalación?

No si la renovación sigue en HTTP-01. Manténgalo accesible para la redirección y las validaciones, o migre la renovación a DNS-01 antes de cerrarlo.

¿Cómo obtener un wildcard *.example.com?

Use DNS-01 con un plugin de API automatizado, disponible en la versión full de simple-acme. Añada también example.com al certificado si el dominio a secas debe quedar cubierto.

¿Un certificado wildcard cubre todos los niveles?

No. *.example.com cubre un solo nivel, como www.example.com, pero ni example.com ni a.b.example.com.

¿RSA o ECDSA?

RSA ofrece una compatibilidad muy amplia. ECDSA proporciona claves y firmas más compactas, pero debe comprobarse con sus clientes más antiguos. Para un primer despliegue IIS de uso general, la opción predeterminada de la herramienta suele ser la más prudente.

¿Basta HTTPS para asegurar el sitio?

No. HTTPS cifra el transporte y autentica el nombre presentado. No sustituye a las actualizaciones, el control de acceso, las copias de seguridad, la seguridad de la aplicación, la protección de los secretos y la supervisión.

¿Y en un VPS Linux?

El planteamiento es el mismo, pero cambia la herramienta: en Nginx o Apache se utiliza normalmente Certbot. Consulte nuestra guía sobre instalar un certificado SSL de Let's Encrypt con Certbot en Nginx o Apache.

Conclusión

En IIS, obtener un certificado de Let's Encrypt lleva unos minutos con simple-acme. Lo que exige atención es todo lo que viene después: el enlace HTTPS correcto en cada nombre, la redirección sin bucle, HSTS desplegado de forma progresiva y, sobre todo, una renovación que siga funcionando dentro de tres meses sin usted.

Recuerde las tres trampas más habituales: un registro AAAA que apunta a otro sitio y hace fracasar la validación, un puerto 80 cerrado tras el paso a HTTPS cuando la renovación depende de él, y un enlace de IIS que nunca se actualizó y sigue sirviendo el certificado antiguo. Compruebe esos tres puntos y la automatización aguantará.

Principales fuentes técnicas

Let's Encrypt

simple-acme

Microsoft