Как использовать `ioredis` для подключения к экземпляру Redis (AWS elasticcache) через ssh-туннель с использованием SSL?

#ssl #redis #ssh-tunnel #node-redis

#ssl #redis #ssh-туннель #узел-redis

Вопрос:

Похоже, это связано ioredis с поддержкой TLS. Это все на Mac, Catalina и т. Д.

У меня запущен экземпляр Redis elasticcache внутри VPC. Я подключаюсь к нему с помощью ssh,

 ssh -L 6379:clustercfg.my-test-redis.amazonaws.com:6379 -N MyEC2
 

Следующее не работает с node 12.9 , ioredis 4.19.4

 > const Redis = require("ioredis");
> const redis = new Redis('rediss://127.0.0.1:6379');

[ioredis] Unhandled error event: Error [ERR_TLS_CERT_ALTNAME_INVALID]: Hostname/IP does not match certificate's altnames: IP: 127.0.0.1 is not in the cert's list: 
    at Object.checkServerIdentity (tls.js:287:12)
    <repeated ... many times>
 

Это тоже не работает:

 > const Redis = require("ioredis");
> const redis = new Redis('redis://127.0.0.1:6379');
> redis.status
'connect'
> redis.set('fooo','barr').then(console.log).catch(console.error)
Promise { <pending> }
> redis.status
'connect'
 

Есть ли способ позволить мне сделать это с ioredis помощью? Это только для отладки. Если первая форма верна, есть ли параметр, разрешающий «нестрогую» проверку сертификата или что-то в этом роде?

Это работает (на mac)

 % openssl s_client -connect localhost:6379
set "fred" "Mary"
 OK
get "fred"
$4
Mary
 

Это работает (с redis, установленным через pip3)

 #!/usr/bin/env python3
import redis
r = redis.Redis(host='127.0.0.1', ssl=True, port=6379)
r.set('foo', 'bar')
print(r.get('foo'))
 

Комментарии:

1. И я думаю, что ответ может быть process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0'; , но мне все еще интересно, есть ли в ioredis конкретный параметр конфигурации, а не делать это глобально. (Это работает.)

Ответ №1:

Хотя я бы не рекомендовал это для производства, вы сказали, что это для отладки.

Вам необходимо отключить проверку подлинности сервера. Вы можете сделать это, переопределив функцию в конфигурации с помощью noop:

 const Redis = require("ioredis");
const redis = new Redis('rediss://127.0.0.1:6379', {
  tls: {
    checkServerIdentity: () => undefined,
  }
});