如何在Sidekiq上为Redis6启用TLS?

问题

在我的 Ruby on Rails 应用程序上,我不断收到以下有关Heroku Redis Premium 0 附加组件的错误:

OpenSSL::SSL::SSLError:SSL_connect 返回=1 errno=0 state=error:证书验证失败(证书链中的自签名证书)

Heroku Redis文档提到我需要在 Redis 客户端的配置中启用 TLS 才能连接到 Redis 6 数据库。为了实现这一点,我已经阅读了redis-rb上的 SSL/TLS 支持文档。我的理解是;我需要分配ca_file,certkeyRedis.new#ssl_params. 问题是如何为 Redis 或通过 Heroku 上的 Sidekiq 设置这些?

更新

更新 3:Heroku 支持提供了解决问题的答案。

更新 2:创建 Heroku 支持票和等待响应。

更新 1:询问Sidekiq 的 Github 问题,并被建议去写 Heroku 支持。当我得到答案时,会更新这个问题。


相关信息

我已经验证了当附加组件是以下任一情况时,该应用程序确实可以工作:

  • Redis 6 的业余爱好开发
  • Redis 5 的溢价 0

版本:

  • 红宝石 – 3.0.0p0
  • Ruby on Rails – 6.1.1
  • Redis – 6.0
  • redis-rb – 4.2.5
  • Sidekiq – 6.2.1
  • Heroku 堆栈 – 20

一些帮助我缩小问题范围的链接:

  • https://bibwild.wordpress.com/2020/11/24/are-you-talking-to-heroku-redis-in-cleartext-or-ssl/
  • https://mislav.net/2013/07/ruby-openssl/

回答

解决方案

使用OpenSSL::SSL::VERIFY_NONE您的Redis客户端。

赛德克

# config/initializers/sidekiq.rb
Sidekiq.configure_server do |config|
  config.redis = { ssl_params: { verify_mode: OpenSSL::SSL::VERIFY_NONE } }
end

Sidekiq.configure_client do |config|
  config.redis = { ssl_params: { verify_mode: OpenSSL::SSL::VERIFY_NONE } }
end

Redis

Redis.new(url: 'url', driver: :ruby, ssl_params: { verify_mode: OpenSSL::SSL::VERIFY_NONE })

原因

Redis 6 需要 TLS 才能连接。但是,Heroku 支持解释说,他们管理从路由器级别到涉及自签名证书的应用程序级别的请求。事实证明,Heroku 在路由器级别终止 SSL,请求从那里通过 HTTP 转发到应用程序,而一切都在 Heroku 的防火墙和安全措施之后。


来源

  • https://ogirginc.github.io/en/heroku-redis-ssl-error
  • https://devcenter.heroku.com/articles/securing-heroku-redis#connecting-directly-to-stunnel
  • It works!
  • The second part you can put into config/environment/production.rb as well. For example:

    `config.cache_store = :redis_cache_store, { url: ENV['REDIS_URL'], expires_in: 1.hour, ssl_params: { verify_mode: OpenSSL::SSL::VERIFY_NONE } }`


以上是如何在Sidekiq上为Redis6启用TLS?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>