Una instalación o reconstrucción de Discourse puede rechazar un certificado de Let’s Encrypt válido con:
C=US, O=Let's Encrypt, CN=YR2
error 2 at 1 depth lookup: unable to get issuer certificate
error fullchain.cer: verification failed
Reproduje esto inmediatamente después de la emisión exitosa de RSA. La comprobación fallida desencadena una solicitud innecesaria de --force, lo que puede llevar a HTTP 429 / rateLimited / “too many certificates”. En mi instalación, la emisión de ECDSA se bloqueó entonces y HTTPS no se inició.
Con las cadenas afectadas, cada reconstrucción o reinicio de contenedor puede desencadenar una reemisión forzada innecesaria de certificados RSA y ECDSA, incluso cuando aún son válidos. Las reemisiones exitosas consumen la cuota de Let’s Encrypt, por lo que reconstrucciones o reinicios repetidos pueden alcanzar rápidamente el límite de tasa.
Esto puede pasar desapercibido mientras HTTPS siga funcionando con los certificados ya instalados. Eliminar y reinstalar una instancia con el mismo nombre de host no restablece esa cuota. Si faltan los certificados requeridos en la nueva instalación, la emisión limitada por tasa puede impedir que HTTPS se inicie.
Solución
En templates/web.letsencrypt.ssl.template.yml, dentro de cert_exists(), reemplaza:
- openssl verify -CAfile <(openssl x509 -in ca.cer) fullchain.cer
+ openssl verify -untrusted ca.cer fullchain.cer
Mantén el resto de la función sin cambios. La plantilla corregida debe incluirse en la próxima reconstrucción del contenedor para actualizar /usr/local/bin/letsencrypt.
Si ya estás limitado por tasa, el parche no restablece la cuota. Aplica la solución y respeta el tiempo de retry after antes de intentar más emisiones.
Confirmar el problema de verificación de cadena
Desde el directorio del certificado afectado dentro del contenedor (/shared/letsencrypt/<hostname>, o <hostname>_ecc), compara:
openssl verify -CAfile <(openssl x509 -in ca.cer) fullchain.cer
openssl verify -untrusted ca.cer fullchain.cer
En el caso reproducido, el primer comando falla con el error 2; el segundo devuelve:
fullchain.cer: OK
Causa y validación
openssl x509 -in ca.cer solo lee el primer certificado del paquete de emisor. En la cadena YR2 observada, descarta el Root YR con firma cruzada necesario para llegar a ISRG Root X1.
-untrusted ca.cer proporciona el paquete completo del emisor manteniendo los anclajes de confianza en el almacén del sistema, preservando la intención de la corrección de 2021 (#576).
Verifiqué las cadenas RSA y ECDSA reales dentro del contenedor. Una reconstrucción completa con el parche reutilizó ambos certificados existentes: dos mensajes de Skip, ambas cadenas instaladas y nginx -t pasó.