with nodejs node certificates node.js https ssl-certificate

node.js - certificates - openssl nodejs



¿Ignora el certificado ssl autofirmado no válido en node.js con https.request? (8)

Estoy trabajando en una pequeña aplicación que inicia sesión en mi enrutador inalámbrico local (Linksys) pero tengo un problema con el certificado ssl autofirmado del enrutador.

Corrí wget 192.168.1.1 y obtuve:

ERROR: cannot verify 192.168.1.1''s certificate, issued by `/C=US/ST=California/L=Irvine/O=Cisco-Linksys, LLC/OU=Division/CN=Linksys/[email protected]'': Self-signed certificate encountered. ERROR: certificate common name `Linksys'' doesn''t match requested host name `192.168.1.1''. To connect to 192.168.1.1 insecurely, use `--no-check-certificate''.

En nodo, el error que se captura es:

{ [Error: socket hang up] code: ''ECONNRESET'' }

Mi código de muestra actual es:

var req = https.request({ host: ''192.168.1.1'', port: 443, path: ''/'', method: ''GET'' }, function(res){ var body = []; res.on(''data'', function(data){ body.push(data); }); res.on(''end'', function(){ console.log( body.join('''') ); }); }); req.end(); req.on(''error'', function(err){ console.log(err); });

¿Cómo puedo conseguir que node.js haga el equivalente de "--no-check-certificate"?


Añadiendo a la respuesta de @Armand:

Agregue la siguiente variable de entorno:

NODE_TLS_REJECT_UNAUTHORIZED = 0 por ejemplo, con export:

exportar NODE_TLS_REJECT_UNAUTHORIZED = 0 (con muchas gracias a Juanra)

Si estás en uso de windows:

set NODE_TLS_REJECT_UNAUTHORIZED=0

Gracias a: @ weagle08


Agregue la siguiente variable de entorno:

NODE_TLS_REJECT_UNAUTHORIZED=0

por ejemplo, con la export :

export NODE_TLS_REJECT_UNAUTHORIZED=0

(con gran agradecimiento a Juanra)


En sus opciones de solicitud, intente incluir lo siguiente:

var req = https.request({ host: ''192.168.1.1'', port: 443, path: ''/'', method: ''GET'', rejectUnauthorized: false, requestCert: true, agent: false },


No creas a todos aquellos que intentan engañarte.

En su solicitud, simplemente añada:

ca: [fs.readFileSync([certificate path], {encoding: ''utf-8''})]

Si activa los certificados no autorizados, no estará protegido (expuesto a MITM por no validar la identidad), y trabajar sin SSL no será una gran diferencia. La solución es especificar el certificado de CA que espera, como se muestra en el siguiente fragmento de código. Asegúrese de que el nombre común del certificado sea idéntico a la dirección a la que llamó en la solicitud (según lo especificado en el host):

Lo que obtendrás entonces es:

var req = https.request({ host: ''192.168.1.1'', port: 443, path: ''/'', ca: [fs.readFileSync([certificate path], {encoding: ''utf-8''})], method: ''GET'', rejectUnauthorized: true, requestCert: true, agent: false },

Lea este artículo (divulgación: publicación de blog escrita por el autor de esta respuesta) aquí para comprender:

  • Cómo funcionan los certificados de CA
  • Cómo generar CA Certs para realizar pruebas fácilmente con el fin de simular el entorno de producción

O puede intentar agregar una resolución de nombres local (el archivo de hosts encuentra en el directorio, etc en la mayoría de los sistemas operativos, los detalles difieren), algo como esto:

192.168.1.1 Linksys

y después

var req = https.request({ host: ''Linksys'', port: 443, path: ''/'', method: ''GET'' ...

trabajará.


Para meteorJS puede configurar con npmRequestOptions.

HTTP.post(url, { npmRequestOptions: { rejectUnauthorized: false // TODO remove when deploy }, timeout: 30000, // 30s data: xml }, function(error, result) { console.log(''error: '' + error); console.log(''resultXml: '' + result); });


Respuesta barata e insegura:

Añadir

process.env["NODE_TLS_REJECT_UNAUTHORIZED"] = 0;

en código, antes de llamar a https.request()

En esta question se responde a una forma más segura (la solución anterior hace que todo el proceso del nodo sea inseguro).


También puede crear una instancia de solicitud con las opciones predeterminadas:

require(''request'').defaults({ rejectUnauthorized: false })