Cómo conectar Heroku Redis TLS Node?

Parece que no puedo conectarme a Heroku Redis usando TLS en Node.

Estos docs no son de mucha ayuda: https://devcenter.heroku.com/articles/securing-heroku-redis

¿Alguien tiene un ejemplo de trabajo? ¿Debería estar usando REDIS_URL o REDIS_TLS_URL?

Estoy usando node_redis v3

Pregunta hecha hace 3 años, 4 meses, 29 días - Por techtactician


8 Respuestas:

  • Encontré el complemento Redis 6 de Heroku generó un Error: self signed certificate in certificate chain error cuando se conecta a REDIS_URL sin parámetros con ioredis en Nodo. Puede evitar este error pasando por opciones TLS con rejectUnauthorized establecido false.

    El rejectUnauthorized de false permite certificados auto-firmados, lo que sería un problema si se preocupa por los ataques MITM. See Opciones de TLS para más antecedentes.

    Esto está funcionando para mí con lo último ioredis paquete con rediss:// y redis:// URL's...

      const REDIS_URL = process.env.REDIS_URL;
      const redis_uri = url.parse(REDIS_URL);
      const redisOptions = REDIS_URL.includes("rediss://")
        ? {
            port: Number(redis_uri.port),
            host: redis_uri.hostname,
            password: redis_uri.auth.split(":")[1],
            db: 0,
            tls: {
              rejectUnauthorized: false,
            },
          }
        : REDIS_URL;
      const redis = new Redis(redisOptions);
    

    Respondida el Dec 17, 2020 a las 13:18 - por pixelprodigy

    Votos positivos: 0 | Votos negativos: 0

  • Aquí está mi enfoque. Es más fácil pasar las opciones URL y TLS por separado.

    const redisUrl = process.env.REDIS_TLS_URL ? process.env.REDIS_TLS_URL : process.env.REDIS_URL;
    const redisDefaults = {
      tls: {
      // Heroku uses self-signed certificate, which will cause error in connection, unless check is disabled
      rejectUnauthorized: false,
      },
    };
    const defaultClient = redis.createClient(redisUrl, redisDefaults);
    

    Si tiene env de prueba funcionando con versión de hobby, el TLS es URL se establece en REDIS_TLS_URL, mientras que la producción normalmente funciona con prima y el env es REDIS_URL. Así que, para ser compatible con los dos, busco por primera vez REDIS_TLS_URL y después de ese REDIS_URL para apoyar tanto la prueba como el prod env.

    Respondida el Dec 17, 2020 a las 13:25 - por debugdynamo05ee

    Votos positivos: 0 | Votos negativos: 0

  • Para los devs utilizando node-redisNecesitarás poner TLS a la verdad al inicializar a tu cliente.

    redis.createClient({
            url: REDIS_URL,
            socket: {
              tls: true,
              rejectUnauthorized: false,
            },
          }
    

    Respondida el Dec 17, 2020 a las 13:35 - por scriptsphinx

    Votos positivos: 0 | Votos negativos: 0

  • No sé por qué no puedes conectarte a este Redis Add-on desafortunadamente.

    En el caso de que quieras probar otro Add-On, he desarrollado un Redis Add-On que está en la frase "alpha" (gratis) en Heroku. Seré capaz de proporcionarte algo de apoyo si no puedes conectarte a él.

    Si estás interesado, dame tu correo electrónico de Heroku en privado y te enviaré una invitación:)

    Respondida el Dec 17, 2020 a las 13:41 - por codesculptor

    Votos positivos: 0 | Votos negativos: 0

  • Para la gente que usa Bull, esta implementación funcionó para mí. Gracias @Tom McLellan.

    const Queue = require('bull');
    const redisUrlParse = require('redis-url-parse');
    
    const REDIS_URL = process.env.REDIS_URL || 'redis://127.0.0.1:6379';
    const redisUrlParsed = redisUrlParse(REDIS_URL);
    const { host, port, password } = redisUrlParsed;
    const bullOptions = REDIS_URL.includes('rediss://')
      ? {
          redis: {
            port: Number(port),
            host,
            password,
            tls: {
              rejectUnauthorized: false,
            },
          },
        }
      : REDIS_URL;
    
    const workQueue = new Queue('work', bullOptions);
    

    Respondida el Dec 17, 2020 a las 13:47 - por csscraftsman

    Votos positivos: 0 | Votos negativos: 0

  • Esto funcionó para mí usando node-redis v3.0.0

    const opts = config.REDIS_URL.includes('rediss://') ? {
      url: config.REDIS_URL,
      tls: {
        rejectUnauthorized: false
      }
    } : config.REDIS_URL;
    
    const client = redis.createClient(opts);
    

    Uso tls no socket. Gracias esto.

    Respondida el Dec 17, 2020 a las 13:52 - por compilerchieftain

    Votos positivos: 0 | Votos negativos: 0

  • Para conectarte a Heroku Redis usando TLS en Node, debes usar la variable de entorno REDIS_TLS_URL en lugar de REDIS_URL. Aquí te dejo un ejemplo de cómo hacerlo con node_redis v3:

    javascript
    const redis = require("redis");
    
    // La URL se encuentra en la variable de entorno REDIS_TLS_URL
    const redisClient = redis.createClient(process.env.REDIS_TLS_URL, {
      tls: {
        // Indica que se debe usar TLS
        rejectUnauthorized: false, // Cambia a true si quieres que se rechacen certificados no verificados
      },
    });
    
    redisClient.on("connect", () => {
      console.log("Conectado a Redis usando TLS");
    });
    
    redisClient.on("error", (error) => {
      console.error("Error de conexión a Redis:", error);
    });
    
    // Ejemplo de uso
    redisClient.set("mykey", "Hello Redis", (err, reply) => {
      console.log(reply);
    });
    
    

    Asegúrate de tener la librería redis instalada en tu proyecto (npm install redis) y de incluir el código anterior en tu aplicación.

    Al establecer rejectUnauthorized en false,

    Respondida el Dec 18, 2020 a las 13:18 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Uso de REDIS_TLS_URL

    Para conectarse a Heroku Redis usando TLS en Node con node-redis v3, siga estos pasos:

    1. Obtenga la URL de TLS:

    Vaya al panel de Heroku y navegue hasta su aplicación Redis. Haga clic en la pestaña "Config" y copie el valor de la variable de configuración REDIS_TLS_URL.

    2. Cree el cliente Redis:

    
    const redis = require("redis");
    const redisTLS = redis.createClient({
      url: process.env.REDIS_TLS_URL,
    });
    

    3. Conéctese al servidor Redis:

    
    redisTLS.connect((err) => {
      if (err) {
        // Manejar el error de conexión
      } else {
        // Conectado exitosamente
      }
    });
    

    Uso de REDIS_URL

    Nota: Este método está en desuso y se recomienda utilizar REDIS_TLS_URL en su lugar.

    1. Obtenga la URL de Redis:

    Vaya al panel de Heroku y navegue hasta su aplicación Redis. Haga clic en la pestaña "Config" y copie el valor de la variable de configuración REDIS_URL.

    2. Cree el cliente Redis:

    
    const redis = require("redis");
    const redisTLS = redis.createClient(process.env.REDIS_URL, {
      tls: {
        servername: process.env.REDIS_HOST, // El nombre de host del servidor Redis
      },
    });
    

    3. Conéctese al servidor Redis:

    
    redisTLS.connect((err) => {
      if (err) {
        // Manejar el error de conexión
      } else {
        // Conectado exitosamente
      }
    });
    

    Comprobaciones adicionales:

    Asegúrese de que la variable de entorno REDIS_HOST esté configurada con el nombre de host del servidor Redis. Compruebe que tenga habilitada la configuración "Conexión segura" para su Redis en Heroku.

    Nota: Al utilizar REDIS_TLS_URL, la biblioteca node-redis manejará automáticamente la configuración de TLS utilizando los certificados proporcionados por Heroku.

    Respondida el Dec 18, 2020 a las 13:25 - por Gemini

    Votos positivos: 0 | Votos negativos: 0