Herkou Redis - 证书验证失败(证书链中的自签名证书)

问题描述 投票:0回答:5

我在我的一个业余项目中使用 Heroku Redis 一段时间了。我目前用它做三件事

  1. 它是我存储 firebase 证书的地方
  2. 用于缓存网站上的数据
  3. 它用于 Rails sidekiq 作业

最近,我的heroku 使用量上升了,我不得不将其更改为使用heroku redis 高级计划。从那时起,我就以某种方式得到了

error: SSL_connect returned=1 errno=0 state=error: certificate verify failed (self signed certificate in certificate chain)
。一切都保持不变,但错误开始突然出现。

heroku-redis 高级计划与基本的 heroku-redis 计划有根本不同吗?

我正在 Rails 上使用 ruby,如果有帮助的话,可以使用 Heroku Redis 部署在 Heroku 上。

ruby-on-rails heroku redis heroku-redis
5个回答
21
投票

根据 Heroku 的 docs

你需要

创建一个名为 config/initializers/redis.rb 的初始化文件 包含:

$redis = Redis.new(url: ENV["REDIS_URL"], ssl_params: { verify_mode: OpenSSL::SSL::VERIFY_NONE })

此外,如果您在尝试使用 sidekiq 时遇到此问题:

创建一个名为 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

15
投票

实际上,当您在heroku应用程序上安装Heroku Redis时,它会为您创建2个配置变量:REDIS_TLS_URL和REDIS_URL。

文档实际上不正确,您必须将 SSL 设置为 verify_none,因为 TLS 会自动发生。

来自 Heroku 支持:

“我们的数据基础设施使用自签名证书,因此证书 可以定期循环...需要设置verify_mode 配置变量为 OpenSSL::SSL::VERIFY_NONE"


7
投票

@ricks 的回答让我完成了 90% 的任务,但对于像我这样在 Heroku 的 Redis 中使用 Rails.cache 的人来说,你不需要那个初始化程序,只需要在 production.rb 中配置这一行:

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

6
投票

对于其他一些提出这个问题的用户,可能也有我今天遇到的同样的问题。错误消息与 Heroku 中的错误消息相同,但与 Hotwire 和

config/cable.yml
文件有关。当您将以下内容添加到该文件时,错误就会消失。

production:
  adapter: redis
  url: <%= ENV.fetch("REDIS_URL") { "redis://localhost:6379/1" } %>
  channel_prefix: name_production
  ssl_params:
    verify_mode: <%= OpenSSL::SSL::VERIFY_NONE %>

0
投票

REDIS_TLS_URL 将于 2024 年 12 月 2 日起弃用。 我通过在设置文件中添加参数来修复此问题:

# Celery settings
BROKER_URL = f"{os.environ.get('REDIS_URL')}?ssl_cert_reqs=none"
CELERY_RESULT_BACKEND = f"{os.environ.get('REDIS_URL')}?ssl_cert_reqs=none"
CELERY_TASK_SERIALIZER = "json"
CELERY_BROKER_TRANSPORT_OPTIONS = {
    "ssl_cert_reqs": "CERT_NONE",
}

# Redis settings
CACHES = {
    "default": {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": f"{os.environ.get('REDIS_URL')}?ssl_cert_reqs=none",
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
            "CONNECTION_POOL_KWARGS": {"ssl_cert_reqs": "CERT_NONE"},
        },
    }
}

不要在 Heroku 配置变量中添加参数,因为它们会循环。那么参数就会丢失。

© www.soinside.com 2019 - 2024. All rights reserved.