Heroku Redis 上的 SSL 认证验证失败

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

我正在使用 Redis 高级计划在 Heroku 上部署 Flask 应用程序。我收到以下错误:“SSL 认证验证失败”。尝试修复:

  • 降级到Redis 5
  • ssl_cert_reqs=None
    传递给
    Redis
     中的 
    redis-py
  • 构造函数

此问题的解决方案可能是:

  1. 解释如何在 heroku redis 高级计划上禁用 TLS 认证
  2. 解释如何在 Heroku Redis 高级计划上进行 TLS 认证

从 Heroku 的文档来看,这可能是一个提示:“您必须在 Redis 客户端的配置中启用 TLS 才能连接到 Redis 6 数据库”。我不明白这是什么意思。

ssl flask heroku redis
9个回答
10
投票

我通过在 Heroku 配置中将

?ssl_cert_reqs=CERT_NONE
添加到
REDIS_URL
的末尾解决了我的问题。


9
投票

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

来自 Heroku 支持:

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

我通过将 ssl_params 设置为 verify_none 解决了这个问题:

ssl_params: { verify_mode: OpenSSL::SSL::VERIFY_NONE } }

对我来说,这是我配置 redis 的地方(在 sidekiq 初始化程序中):

# config/initializers/sidekiq.rb
Sidekiq.configure_client do |config|
  config.redis = { url: ENV['REDIS_URL'], size: 1, network_timeout: 5, 
    ssl_params: { verify_mode: OpenSSL::SSL::VERIFY_NONE } }
end

Sidekiq.configure_server do |config|
  config.redis = { url: ENV['REDIS_URL'], size: 7, network_timeout: 5, 
    ssl_params: { verify_mode: OpenSSL::SSL::VERIFY_NONE } }
end

5
投票

您可以通过降级到 Redis 5 并将

ssl_cert_reqs=None
传递给
Redis
构造函数来禁用 Heroku 上的 TLS 认证。

$ heroku addons:create heroku-redis:premium-0 --version 5
from redis import ConnectionPool, Redis
import os
connection_pool = ConnectionPool.from_url(os.environ.get('REDIS_URL'))
app.redis = Redis(connection_pool=connection_pool, ssl_cert_reqs=None)

我的错误是没有同时做这两件事。

理想的解决方案是解释如何为 Redis 6 配置 TLS 认证。


4
投票

我在这方面遇到了困难,但最终解决了......

关于这个主题的很多文档和帖子都不清楚。我已要求 Heroku 更新其在 https://devcenter.heroku.com/articles/connecting-heroku-redis#connecting-in-python 上的文档,以包含对

Procfile
的特定更改。

它有点像上面提到的,但指的是“Heroku config”而不是专门的

Procfile

在您的

Procfile
中将
?ssl_cert_reqs=none
添加到
$REDIS_URL

例如:

web: gunicorn webapp:app
worker: rq worker -u $REDIS_URL?ssl_cert_reqs=none queue

不要直接更新

REDIS_URL
,因为 Heroku 会不时循环此操作。

我还根据原始文档更新了 Redis 设置:

url = urlparse(os.environ.get("REDIS_URL"))
r = redis.Redis(host=url.hostname, port=url.port, password=url.password, ssl=True, ssl_cert_reqs=None)

但正是对

Procfile
的更改最终让 Redis v6.2.11 与 TLS 能够正常工作。


2
投票

如果使用

django-rq
包装器并尝试处理此问题,请确保不要将
URL
参数与
SSL_CERTS_REQS
一起使用。 有一个“未解决的问题”描述了这一切,但基本上您需要指定每个连接参数而不是使用 URL。


2
投票
ssl_cert_reqs

参数。在 Heroku 上,在此类情况下可能导致错误的常见疏忽是:使用

REDIS_URL
而不是
REDIS_TLS_URL

解决方案:

redis_url = os.environ.get('REDIS_TLS_URL')

    


1
投票

import os, redis redis_url = os.getenv('REDIS_URL') redis_store = redis.from_url(redis_url, ssl_cert_reqs=None)

在我的本地开发环境中,我不使用带有 rediss 方案的 redis,因此我使用这样的函数来允许在这两种情况下工作:

def get_redis_store(): ''' Get a connection pool to redis based on the url configured on env variable REDIS_URL Returns ------- redis.ConnectionPool ''' redis_url = os.getenv('REDIS_URL') if redis_url.startswith('rediss://'): redis_store = redis.from_url( redis_url, ssl_cert_reqs=None) else: redis_store = redis.from_url(redis_url) return redis_store



1
投票

redisClient = redis.createClient({ url: process.env.REDIS_URL, socket: { tls: true, rejectUnauthorized: false })



0
投票

我的 REDIS URL 变量保存在 Heroku 服务器中,然后保存在 Heokru REDIS 中,并通过 Heroku 键值存储迷你插件在 REDIS 上每月自动更新一次。这不会更新保存在服务器上的变量,每次 Redis 发生更改时我都需要更新该变量,但这是一个不同的问题。

这是我的代码如何在 server.js 文件中查找此变量

const Redis = require('ioredis'); const redisUrl = process.env.REDIS_URL.includes('?') ? `${process.env.REDIS_URL}&ssl_cert_reqs=CERT_NONE` : `${process.env.REDIS_URL}?ssl_cert_reqs=CERT_NONE`; // Create a job queue const workQueue = new Queue('work', { redis: { url: redisUrl } });

这是我的代码如何在我的worker.js代码中查找变量

const redisUrl = process.env.REDIS_URL.includes('?') ? `${process.env.REDIS_URL}&ssl_cert_reqs=CERT_NONE` : `${process.env.REDIS_URL}?ssl_cert_reqs=CERT_NONE`; const workQueue = new Queue('work', { redis: { url: redisUrl } });

这是我的服务器日志中显示的错误

2024-11-15T13:06:10.107332+00:00 app[worker.1]: Queue Error: Error: connect ECONNREFUSED 127.0.0.1:6379 2024-11-15T13:06:10.107333+00:00 app[worker.1]: at TCPConnectWrap.afterConnect [as oncomplete] (node:net:1610:16) { 2024-11-15T13:06:10.107333+00:00 app[worker.1]: errno: -111, 2024-11-15T13:06:10.107333+00:00 app[worker.1]: code: 'ECONNREFUSED', 2024-11-15T13:06:10.107333+00:00 app[worker.1]: syscall: 'connect', 2024-11-15T13:06:10.107333+00:00 app[worker.1]: address: '127.0.0.1', 2024-11-15T13:06:10.107333+00:00 app[worker.1]: port: 6379 2024-11-15T13:06:10.107334+00:00 app[worker.1]: }

链接 #1 
https://help.heroku.com/45F0AY28/what-are-the-upcoming-changes-to-the-redis_url-config-var-for-heroku-key-value-store-mini-add -on

链接#2

https://stackoverflow.com/questions/65042551/ssl-certification-verify-failed-on-heroku-redis#:~:text=I%20solved%20my% 20问题%20by%20添加%20%3Fssl_cert_reqs%3DCERT_NONE%20到%20%20END%20of%20REDIS_URL%20in%20my%20Heroku%20config

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