Mensaje de error
verify error:num=19:self-signed certificate in certificate chain
También se muestra como
- verify error:num=19:self signed certificate in certificate chain
- error 19 at 2 depth lookup: self-signed certificate in certificate chain
OpenSSL 3.x imprime «self-signed»; 1.1.1, «self signed». openssl verify lo notifica como «error 19 at <depth> depth lookup: …», donde la profundidad es la posición de la raíz en la cadena.
OpenSSL CLI (openssl s_client / openssl verify) — X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN
Qué significa
Error 19 de OpenSSL (X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN): la cadena se construyó hasta llegar a un certificado raíz autofirmado que envió el otro extremo, y esa raíz no está en el almacén de confianza. A diferencia del error 18, hay una jerarquía de CA real; a diferencia del error 20, no falta nada. O hay que confiar en la raíz localmente, o se está interceptando la conexión.
Por qué ocurre
Un proxy que inspecciona TLS
frecuenteLos proxies corporativos envían su propia raíz en la cadena. Si el sujeto del certificado superior nombra a tu empresa o a un fabricante de productos de seguridad, se está inspeccionando la conexión.
Una CA privada cuya raíz envía el servidor
frecuenteLos servicios internos suelen enviar la cadena completa, raíz incluida; aun así, los clientes necesitan tener la raíz instalada como ancla de confianza.
La prueba se ejecutó sin el almacén de confianza esperado
ocasionalProbar con un -CAfile que apunta al archivo equivocado, o en una imagen cuyo almacén no incluye la raíz de la empresa, produce este código para un servicio interno correctamente configurado.
Cómo solucionarlo
- 1.
Identificar la raíz y su huella digital
Separa la cadena servida e imprime el sujeto, el emisor y la huella digital SHA-256 de cada certificado; compara la huella digital de la raíz con la que publica tu equipo de TI o de PKI.
bash openssl s_client -connect api.example.com:443 -servername api.example.com -showcerts </dev/null 2>/dev/null \ | awk '/BEGIN CERT/{n++} {print > ("cert" n ".pem")}' for f in cert[0-9]*.pem; do openssl x509 -in "$f" -noout -subject -issuer -fingerprint -sha256 2>/dev/null; done - 2.
Probar con la raíz correcta y luego instalarla
Si -CAfile con la raíz publicada da «Verify return code: 0 (ok)», instala esa raíz en el almacén del sistema.
bash echo | openssl s_client -connect api.example.com:443 -servername api.example.com \ -CAfile corp-root-ca.pem 2>&1 | grep 'Verify return code' sudo cp corp-root-ca.pem /usr/local/share/ca-certificates/corp-root-ca.crt && sudo update-ca-certificates - 3.
Propietarios del servidor: enviar solo el certificado hoja y los intermedios
Enviar la raíz desperdicia bytes en cada handshake y nunca la convierte en una raíz de confianza; en su lugar, distribuye la raíz a los clientes.
bash # Server owners: the root does not belong in the served chain cat server.pem intermediate.pem > fullchain.pem
Errores relacionados
verify error:num=18:self-signed certificateOpenSSL CLI (openssl s_client / openssl verify)verify error:num=20:unable to get local issuer certificateOpenSSL CLI (openssl s_client / openssl verify)curl: (60) SSL certificate problem: self-signed certificate in certificate chaincurl (OpenSSL backend)self-signed certificate in certificate chainNode.js tls / https / fetch