with tutorial started node guide docs community biblioteca javascript node.js express request

javascript - tutorial - Solicitud de Node.js CERT_HAS_EXPIRED



node js javascript version (5)

Estoy utilizando la solicitud de Mikeal ( https://github.com/mikeal/request ) para realizar una solicitud de https a un servidor. Sin embargo, sigo obteniendo un error de autorización de CERT_HAS_EXPIRED.

request({ url: ''https://www.domain.com/api/endpoint'', strictSSL: false }, function(error, response, body) { if(!error && response.statusCode == 200) { res.json(JSON.parse(body)); } else { res.json(response.statusCode, {''error'': ''error''}) } });

He intentado establecer strictSSL en verdadero y falso, ambos emiten el mismo error de CERT_HAS_EXPIRED. ¿Qué está causando este problema y hay alguna forma de solucionarlo en nodejs?


La mejor manera de arreglar esto:

Renovar el certificado Esto se puede hacer de forma gratuita utilizando Greenlock que emite certificados a través de Let''s Encrypt ™ v2

Una forma menos insegura de arreglar esto:

''use strict''; var request = require(''request''); var agentOptions; var agent; agentOptions = { host: ''www.example.com'' , port: ''443'' , path: ''/'' , rejectUnauthorized: false }; agent = new https.Agent(agentOptions); request({ url: "https://www.example.com/api/endpoint" , method: ''GET'' , agent: agent }, function (err, resp, body) { // ... });

Al utilizar un agent con rejectUnauthorized no rejectUnauthorized , al menos limita la vulnerabilidad de seguridad a las solicitudes que se ocupan de ese sitio en lugar de hacer que todo el proceso de su nodo sea completamente inseguro.

Otras opciones

Si estuvieras usando un certificado autofirmado, deberías agregar esta opción:

agentOptions.ca = [ selfSignedRootCaPemCrtBuffer ];

Para las conexiones de pares de confianza, también debería agregar estas 2 opciones:

agentOptions.key = clientPemKeyBuffer; agentOptions.cert = clientPemCrtSignedBySelfSignedRootCaBuffer;

Mala idea

Es desafortunado que process.env.NODE_TLS_REJECT_UNAUTHORIZED = ''0''; está incluso documentado. Solo se debe usar para la depuración y nunca se debe convertir en un tipo de código que se ejecute en la naturaleza. Casi todas las bibliotecas que se ejecutan sobre https tienen una forma de pasar las opciones del agente a través de. Aquellos que no deberían ser reparados.


Agregue esto en la parte superior de su archivo:

process.env.NODE_TLS_REJECT_UNAUTHORIZED = ''0'';

PELIGROSO Esto desactiva la comprobación de HTTPS / SSL / TLS en todo su entorno node.js. Por favor, vea la solución usando un agente https a continuación.


Aquí hay una forma más concisa de lograr el método "menos seguro" propuesto por CoolAJ86

request({ url: url, agentOptions: { rejectUnauthorized: false } }, function (err, resp, body) { // ... });


Creo que el strictSSL: false debería (debería haber funcionado, incluso en 2013) funcionar. En resumen, hay tres maneras posibles:

  1. (obvio) ¡Obtenga su CA para renovar el certificado y póngalo en su servidor!
  2. Cambie la configuración predeterminada de su objeto de request :

    const myRequest = require(''request'').defaults({strictSSL: false})

    Muchos módulos que usan node-request internamente también permiten inyectar un objeto de request , por lo que puede hacer que usen su instancia modificada.
  3. (no recomendado) Anule todas las comprobaciones de certificados para todas las conexiones del agente HTTP (S) configurando la variable de entorno NODE_TLS_REJECT_UNAUTHORIZED=0 para el proceso Node.js.

Intente modificar temporalmente request.js y harcode en todas partes como rejectUnauthorized = true, pero sería mejor extender el certificado como una solución a largo plazo.