Axios: Cómo ignorar los problemas de SSL

Creado en 13 nov. 2016  ·  35Comentarios  ·  Fuente: axios/axios

¿Es posible configurar Axios (que se ejecuta en node.js) para ignorar errores específicos de SSL (como certificados caducados)? Me gustaría saber que el certificado SSL tiene un problema, pero quiero que la transacción se complete de todos modos (de forma predeterminada, falla).

Comentario más útil

Puede configurar axios para usar un agente personalizado y establecer rejectUnauthorized en false para ese agente:

// At instance level
const instance = axios.create({
  httpsAgent: new https.Agent({  
    rejectUnauthorized: false
  })
});
instance.get('https://something.com/foo');

// At request level
const agent = new https.Agent({  
  rejectUnauthorized: false
});
axios.get('https://something.com/foo', { httpsAgent: agent });

¡Espero que esto ayude!

Todos 35 comentarios

Puede configurar axios para usar un agente personalizado y establecer rejectUnauthorized en false para ese agente:

// At instance level
const instance = axios.create({
  httpsAgent: new https.Agent({  
    rejectUnauthorized: false
  })
});
instance.get('https://something.com/foo');

// At request level
const agent = new https.Agent({  
  rejectUnauthorized: false
});
axios.get('https://something.com/foo', { httpsAgent: agent });

¡Espero que esto ayude!

@nickuraltsev
no funciona con los cambios anteriores
const https = require ('https');
axios ({
url: url,
método: 'GET',
encabezados: {
'Tipo de contenido': 'aplicación / json'
},
responseType: 'json',
httpsAgent: nuevo https.Agent ({seekUnauthorized: false})
})
.entonces (respuesta => {
})
.catch (error => {
})
}
}

En realidad, encuentro que funciona, pero se ocupa específicamente de los certificados autofirmados. No permite certificados caducados o inválidos. Para permitir _cualquier_ certificado, debe agregar esta línea cerca de la parte superior de su código;

process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';

Esto permitirá casi cualquier cosa, pero también es peligroso, así que utilícelo con precaución.

@ Eric24
No funciona si agrego el código anterior en la primera línea de mi archivo.
Por favor, avíseme la ruta exacta para agregar.

Para mí (necesito ignorar un certificado caducado pero válido por lo demás), funcionó simplemente agregando esta línea justo después de "usar estricto"; en la parte superior del archivo principal node.js, antes de cualquier otro código. Es una configuración de todo o nada, pero su propósito es permitir que se complete una transacción HTTPS cuando el agente terminaría la transacción debido a un problema de certificado. ¿Quizás su escenario particular no esté relacionado con el certificado?

si no está en el nodo, ¿cómo obtener el módulo https ????

El módulo https NO funciona con react-native

+1

@psahni ¿Sabes cómo ignorar el problema de ssl en React Native?

@Germinate : todavía estoy luchando con el mismo problema. Tenemos que cambiar el código nativo de Android. Y tenemos que construir una reacción nativa desde la fuente. Todavía no sé cómo hacerlo.
Una solución es crear un servidor proxy en el nodo entre el servidor principal y el nativo de reacción. Y enrute la solicitud de react native al proxy de nodo al servidor principal.

@psahni ¿Has probado esta solución ?

@Germinate - ¡Se ve genial !. Gracias por compartirlo. Entonces, después de hacer esos cambios. ¿Podemos usar el módulo react-native directamente?

Todavía no funciona con react native: /

¿Funciona en el navegador? Estoy usando axios con una aplicación vue js y obtengo este error net :: ERR_CERT_AUTHORITY_INVALID con un certificado autofirmado. La solución propuesta asume que puedo usar https.Agent pero no sé cómo puedo usar el módulo https en vue. ¿Hay otra manera? Gracias

¿tenemos https dentro de react-native? en caso afirmativo, ¿cómo lo incluimos?

si está utilizando nuxt / axios, puede lograr lo anterior creando un complemento con el siguiente código:
Aquí está el método documentado para crear el complemento en nuxt: https://axios.nuxtjs.org/extend.html

Este patrón de desarrollo puede ser útil si está desarrollando una API localmente con un certificado autofirmado.

import https from 'https';

export default function ({ $axios, store }) {
    const agent = new https.Agent({  
        rejectUnauthorized: false
      });    
    $axios.onRequest(config => {
        if (process.env.dev) {
            config.httpsAgent = agent;
        }                     
    });
}

¿Qué es un ejemplo de "publicación" de esto?

Actualmente estoy tratando de hacer una solicitud de publicación e ignorar SSL.

si está utilizando nuxt / axios, puede lograr lo anterior creando un complemento con el siguiente código:
Aquí está el método documentado para crear el complemento en nuxt: https://axios.nuxtjs.org/extend.html

Este patrón de desarrollo puede ser útil si está desarrollando una API localmente con un certificado autofirmado.

import https from 'https';

export default function ({ $axios, store }) {
    const agent = new https.Agent({  
        rejectUnauthorized: false
      });    
    $axios.onRequest(config => {
        if (process.env.dev) {
            config.httpsAgent = agent;
        }                     
    });
}

¿Llamo a mis solicitudes asyncData o axios existentes de manera diferente después de crear axios.js en la carpeta de módulos?

Mira esto, me lo resolvió: https://stackoverflow.com/a/54475750/8577483

Sigo experimentando este problema. Usando https-browserify para obtener el módulo https del nodo en el navegador.

const instance = axios.create({
    httpsAgent: new https.Agent({  
        rejectUnauthorized: false
    })
});

instance.post("https://...");

devuelve ERR_CERT_AUTHORITY_INVALID

También obtengo el error, usando la aplicación creada con react-create-app

const axios = require('axios');
const https = require('https');

const result = await axios('https://localhost:8080/search/' + text, {
    headers: {"lang": lang},
    httpsAgent: new https.Agent({
        rejectUnauthorized: false
    })
});

También intenté agregar process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0'; al principio del archivo (debajo de const https = require('https'); ) sin ningún efecto.

¿Por qué se cerró esto? No parece que haya una solución que funcione.

Me encontré con este hilo debido a un error de "error de protocolo de enlace ssl" en mis registros y consideré intentar desactivar las comprobaciones como se describe anteriormente. Después de mucha resolución de problemas (originalmente seguí el camino de pensar que estaba relacionado con CORS) terminó siendo porque mi certificado SSL no tenía el certificado CA incluido. Si sospecha que podría ser esto, use uno de los SSL gratuitos Verificando servicios como https://www.ssllabs.com/ssltest/ o https://www.digicert.com/help/ para confirmar que su certificado es bueno. Espero que esto pueda ayudar a alguien más.

De repente también estaba luchando con este problema (a pesar de no haber cambiado nada). Lo que me solucionó fue simplemente realizar una solicitud GET estándar a través de una nueva pestaña. Con esto quiero decir que si tiene una ruta "/ users", intente abrir una nueva pestaña con {serverPath} / users. Me ayudó, aunque no estoy seguro de por qué.

También puede agregar la variable de entorno cuando inicie su entorno de desarrollo:

exportar NODE_TLS_REJECT_UNAUTHORIZED = 0 && yarn dev --env.NODE_TLS_REJECT_UNAUTHORIZED = 0

Y quizás agregarlo a su archivo package.json

"scripts": {
  "dev": "export NODE_TLS_REJECT_UNAUTHORIZED=0 && nuxt --env.NODE_TLS_REJECT_UNAUTHORIZED=0",

Estoy enfrentando el mismo problema. Estoy usando axios y uso el método POST. Probé todas las soluciones mencionadas anteriormente, pero no tuve suerte. ¿Alguien encontró las soluciones de trabajo? Gracias.

No pude hacer que funcione para una sola instancia.

// doesn't work
axios.create({
    httpsAgent: new https.Agent({ rejectUnauthorized: false })
});

// it works
https.globalAgent.options.rejectUnauthorized = false;

Usando nodo;
Este es el error de SSL: unable to get local issuer certificate (20) (de una solicitud curl)

¿Hay alguna actualización sobre esto para React Native?

Estoy experimentando el mismo problema que @Falci : solo funciona cuando se configura la bandera a nivel mundial. Sin embargo, mi problema es un poco diferente, Error: self signed certificate in certificate chain

Estoy enfrentando el mismo problema. Estoy usando axios y uso el método POST. Probé todas las soluciones mencionadas anteriormente, pero no tuve suerte. ¿Alguien encontró las soluciones de trabajo? Gracias.

import axios from "axios";
const https = require('https');

const resp = await axios({
      url,
      method: "POST",
      auth,
      httpsAgent: new https.Agent({
        rejectUnauthorized: false
      })
    });

Trabajó para mi.

Me quedé atascado aquí para el entorno React Native. ¿Alguna solución para la aplicación React Native, por favor?

Hola @fozhao

Si está intentando utilizar certificados no válidos, puede intentar seguir este enfoque:

  1. Instale el certificado en su macbook
  2. Forzar la confianza en el certificado y exportarlo
  3. iOS: instale el certificado de exportación en los dispositivos y el problema se solucionó.
    Android: instale el certificado exportado en el dispositivo y agregue lo siguiente a su archivo network_security_config.xml.
<network-security-config>
    <base-config>
        <trust-anchors>
            <certificates src="system"/>
            <certificates src="user"/>
        </trust-anchors>
    </base-config>
     ....
</network-security-config>

Esta solución funcionó para mi.
¡Gracias!

@Fonger plz elabora más con éxitos y ejemplo.

El módulo https es para el nodo, no funciona en Vue / React / ... Básicamente resulta en lo mismo que process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';
Si desea ignorar SSL porque está usando SSR y de todos modos está obteniendo datos en el servidor local, esto no da como resultado ningún problema de seguridad.

Sin embargo, asegúrese de configurar esa variable env en el servidor, cometí el error al intentar configurarla en el cliente y el servidor aún falla.

@tamangsuresh ¿

¿Fue útil esta página
0 / 5 - 0 calificaciones