Estoy tratando de hacer una solicitud con axios a un extremo de api y me da el siguiente error: Error: unable to verify the first certificate

Parece que el https módulo, que axios usos, es incapaz de verificar el certificado SSL usado en el servidor.

Cuando visite el server con mi navegador, el certificado es válido y puedo ver/descargar. También puedo hacer peticiones a la api en mi navegador a través de https.

Puedo evitar desactivando la verificación. Este código funciona.

const result = await axios.post(
    `https://${url}/login`,
    body,
    {
      httpsAgent: new https.Agent({
        rejectUnauthorized: false
      })
    }
  )

Problema es que esto no verificar el certificado SSL y por lo tanto se abre agujeros de seguridad.

¿Cómo puedo configurar axios para confiar en el certificado y verificar correctamente que?

InformationsquelleAutor Jemi Salo | 2018-07-16

3 Comentarios

  1. 20

    Vieja pregunta, pero en sintonía para aquellos que la tierra aquí. Ningún experto. Por favor, consulte con su distribuidor local de seguridad de los gurús y lo que no.

    Axios es un http(s) del cliente y los clientes http suelen participar en TLS de forma anónima. En otras palabras, el servidor acepta la conexión sin identificar que está intentando conectarse. Esto es diferente a decir, TLS Mutua donde el servidor y el cliente compruebe cada uno de los otros antes de completar el apretón de manos.

    El internet es un lugar aterrador y queremos proteger a nuestros clientes de la conexión a suplantar los extremos públicos. Hacemos esto por garantizar a nuestros clientes a identificar el servidor antes de enviar cualquier dato privado.

    //DO NOT DO THIS IF SHARING PRIVATE DATA WITH SERVICE
    const httsAgent = new https.Agent({ rejectUnauthorized: false });

    Esto es a menudo enviado (y más infame upvoted) como la respuesta de StackOverflow sobre https errores de conexión de cliente en cualquier idioma. Y lo peor de todo es que funciona normalmente, desbloquea el dev y se mueven en su forma alegre. Sin embargo, aunque ciertamente obtener en la puerta, cuya puerta es? Desde que decidió salir de verificar la identidad del servidor, sus pobres cliente no tiene forma de saber si la conexión que acaba de hacer a la intranet de la compañía tiene malos actores escucha en la línea.

    Si el servicio tiene un público SSL cert, el https.Agent por lo general no necesitan ser configurados por el sistema operativo proporciona un conjunto común de confianza públicos CA cert. Este es generalmente el mismo conjunto de CA cert su navegador está configurado para utilizar y es por eso que un defecto axios cliente puede golpear https://google.com con un poco de alboroto.

    Si el servicio tiene un privado SSL cert (auto firmado con fines de prueba o uno firmado por la empresa privada de la CA para proteger sus secretos), el https agente debe estar configurado para confiar en la privada de la CA usado para firmar el servidor cert:

    const httpsAgent = new https.Agent({ ca: MY_CA_BUNDLE });

    donde MY_CA_BUNDLE es una matriz de CA cert en .pem formato.

    • Este último trabajó para mí después de que me he descargado el cert y su cadena. Anteriormente había fracasado, ya que sólo he descargado el certificado para el servicio que quería usar. Para cualquier persona luchando como me fue: asegúrese de descargar toda la cadena .pem.
    • Cómo llegar a toda la cadena de mi certificado autofirmado? Voy a resolver id haciendo como que: const httpsAgent = new https.Agent({ ca: fs.readFileSync(certPath) });
  2. 2

    Crear un agente personalizado con certificado SSL:

    const httpsAgent = new https.Agent({
      rejectUnauthorized: false, //(NOTE: this will disable client verification)
      cert: fs.readFileSync("./usercert.pem"),
      key: fs.readFileSync("./key.pem"),
      passphrase: "YYY"
    })
    
    axios.get(url, { httpsAgent })
    
    //or
    
    const instance = axios.create({ httpsAgent })

    De https://github.com/axios/axios/issues/284

    • rejectUnauthorized: false deshabilita la comprobación de cliente que es uno de los OPs principales preocupaciones.
    • abajo votado como no es wat el OP pedir. Esta respuesta, mientras que todavía correcto (excepto sobre rejectUnauthorized), es acerca de certificado de cliente, donde OP desea verificar el certificado del servidor
  3. 1

    De configuración que funciona para mí (En un Mutuo escenario de Autenticación).

    const httpsAgent = new https.Agent({
      ca: fs.readFileSync("./resource/bundle.crt")    
      cert: fs.readFileSync("./resrouce/thirdparty.crt"),
      key: fs.readFileSync("./resource/key.pem"), 
    })

    Nota: bundle.crt fue preparado desde la provisión de certificados (de la raíz,intermedio,final de la entrada de certificado). Lamentablemente, no hay claridad documentación que se encuentra en este respecto.

Dejar respuesta

Please enter your comment!
Please enter your name here