Este es uno de los fallos de certificado más desconcertantes porque a ti te funciona. Los navegadores de escritorio guardan en caché certificados intermedios vistos en otros sitios y tapan el hueco en silencio; un móvil que nunca ha visto ese intermedio, y cualquier cliente de línea de órdenes, no pueden hacerlo.

El síntoma

  • Bien en tu portátil, no fiable en un móvil.
  • curl dice unable to get local issuer certificate.
  • Una pasarela de pago o un webhook no consiguen conectar mientras los navegadores están tan contentos.

Confírmalo

openssl s_client -connect yourdomain.com:443 -servername yourdomain.com < /dev/null 2>/dev/null \
  | grep -E '^ *[0-9]+ s:|Verify return code'

Quieres ver al menos dos certificados en la lista —el tuyo y el intermedio— y Verify return code: 0 (ok). Un solo certificado más un error de verificación es exactamente este fallo.

La causa es un nombre de archivo

Servir cert.pem en lugar de fullchain.pem. cert.pem es tu certificado a solas; fullchain.pem es tu certificado seguido del intermedio. Es una palabra en la configuración y casi siempre es el problema entero.
# nginx - correct
ssl_certificate     /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
# apache / litespeed
SSLCertificateFile      /etc/letsencrypt/live/example.com/cert.pem
SSLCertificateChainFile /etc/letsencrypt/live/example.com/chain.pem

Recarga y vuelve a comprobar

sudo nginx -t && sudo systemctl reload nginx
curl -sS -o /dev/null -w '%{http_code}\
' https://yourdomain.com

Prueba desde algo que no tenga caché

curl en una máquina que nunca ha visitado el sitio, o un móvil con datos y los datos del sitio borrados. Tu propio navegador es el único cliente que no puede darte la respuesta: consulta Funciona con wifi pero no con datos móviles.