如何在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,cert并key为Redis.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 } }`