Saltar al contenido

Error: no se puede verificar el primer certificado en nodejs

Siéntete libre de compartir nuestra página y códigos con otro, necesitamos tu ayuda para aumentar esta comunidad.

Solución:

Intente agregar el certificado raíz apropiado

Esta siempre será una opción mucho más segura que aceptar ciegamente puntos finales no autorizados, que a su vez solo deben usarse como último recurso.

Esto puede ser tan simple como agregar

require('https').globalAgent.options.ca = require('ssl-root-cas/latest').create();

a su aplicación.

El paquete npm de las CA raíz de SSL (como se usa aquí) es un paquete muy útil con respecto a este problema.

Otro truco sucio, que hará que todas sus solicitudes sean inseguras:

process.env['NODE_TLS_REJECT_UNAUTHORIZED'] = 0

unable to verify the first certificate

La cadena de certificados está incompleta.

Significa que el servidor web al que se está conectando está mal configurado y no incluyó el certificado intermedio en la cadena de certificados que le envió.

Cadena de certificados

Lo más probable es que tenga el siguiente aspecto:

  1. Certificado de servidor: almacena un certificado firmado por intermedio.
  2. Certificado intermedio: almacena un certificado firmado por root.
  3. Certificado raíz: almacena un certificado autofirmado.

El certificado intermedio debe instalarse en el servidor, junto con el certificado del servidor.
Los certificados raíz están integrados en las aplicaciones de software, los navegadores y los sistemas operativos.

La aplicación que sirve el certificado debe enviar la cadena completa, es decir, el certificado del servidor en sí y todos los intermedios. El certificado raíz se supone que es conocido por el cliente.

Recrear el problema

Vaya a https://incomplete-chain.badssl.com usando su navegador.

No muestra ningún error (el candado en la barra de direcciones es verde).
Eso es porque los navegadores tienden a completar la cadena si no se envía desde el servidor.

Ahora, conéctese a https://incomplete-chain.badssl.com usando Node:

// index.js
const axios = require('axios');

axios.get('https://incomplete-chain.badssl.com')
  .then(function (response) 
    console.log(response);
  )
  .catch(function (error) 
    console.log(error);
  );

Registros: “Error: no se pudo verificar el primer certificado“.

Solución

Debe completar la cadena de certificados usted mismo.

Para hacer eso:

1: Necesita obtener el certificado intermedio faltante en .pem formato, entonces

2a: extender el almacén de certificados integrado de Node usando NODE_EXTRA_CA_CERTS,

2b: o pase su propio paquete de certificados (intermedios y raíz) usando ca opción.

1. ¿Cómo obtengo un certificado intermedio?

Utilizando openssl (viene con Git para Windows).

Guarde los detalles del certificado del servidor remoto:

openssl s_client -connect incomplete-chain.badssl.com:443 -servername incomplete-chain.badssl.com | tee logcertfile

Estamos buscando al emisor (el certificado intermedio es el emisor / firmante del certificado del servidor):

openssl x509 -in logcertfile -noout -text | grep -i "issuer"

Debería proporcionarle el URI del certificado de firma. Descargalo:

curl --output intermediate.crt http://cacerts.digicert.com/DigiCertSHA2SecureServerCA.crt

Finalmente, conviértalo a .pem:

openssl x509 -inform DER -in intermediate.crt -out intermediate.pem -text

2a. NODE_EXTRA_CERTS

Estoy usando cross-env para establecer variables de entorno en package.json Archivo:

"start": "cross-env NODE_EXTRA_CA_CERTS="C:\Users\USERNAME\Desktop\ssl-connect\intermediate.pem" node index.js"

2b. ca opción

Esta opción sobrescribirá las CA raíz integradas del nodo.

Es por eso que necesitamos crear nuestra propia CA raíz. Utilice ssl-root-cas.

Luego, crea un personalizado https agente configurado con nuestro paquete de certificados (raíz e intermedio). Pase este agente a axios al hacer la solicitud.

// index.js
const axios = require('axios');
const path = require('path');
const https = require('https');
const rootCas = require('ssl-root-cas').create();

rootCas.addFile(path.resolve(__dirname, 'intermediate.pem'));
const httpsAgent = new https.Agent(ca: rootCas);

axios.get('https://incomplete-chain.badssl.com',  httpsAgent )
  .then(function (response) 
    console.log(response);
  )
  .catch(function (error) 
    console.log(error);
  );

En lugar de crear un personalizado https agente y pasárselo a axios, puede colocar los certificados en el https agente global:

// Applies to ALL requests (whether using https directly or the request module)
https.globalAgent.options.ca = rootCas;

Recursos:

  1. https://levelup.gitconnected.com/how-to-resolve-certificate-errors-in-nodejs-app-involving-ssl-calls-781ce48daded
  2. https://www.npmjs.com/package/ssl-root-cas
  3. https://github.com/nodejs/node/issues/16336
  4. https://www.namecheap.com/support/knowledgebase/article.aspx/9605/69/how-to-check-ca-chain-installation
  5. https://superuser.com/questions/97201/how-to-save-a-remote-server-ssl-certificate-locally-as-a-file/
  6. Cómo convertir .crt a .pem

valoraciones y reseñas

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *