我正在使用 Redis 高级计划在 Heroku 上部署 Flask 应用程序。我收到以下错误:“SSL 认证验证失败”。尝试修复:
ssl_cert_reqs=None
传递给 Redis
中的
redis-py
此问题的解决方案可能是:
从 Heroku 的文档来看,这可能是一个提示:“您必须在 Redis 客户端的配置中启用 TLS 才能连接到 Redis 6 数据库”。我不明白这是什么意思。
我通过在 Heroku 配置中将
?ssl_cert_reqs=CERT_NONE
添加到 REDIS_URL
的末尾解决了我的问题。
文档实际上不正确,您必须将 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
您可以通过降级到 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 认证。
我在这方面遇到了困难,但最终解决了......
关于这个主题的很多文档和帖子都不清楚。我已要求 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 能够正常工作。
ssl_cert_reqs
参数。在 Heroku 上,在此类情况下可能导致错误的常见疏忽是:使用
REDIS_URL
而不是 REDIS_TLS_URL
。解决方案:
redis_url = os.environ.get('REDIS_TLS_URL')
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
redisClient = redis.createClient({
url: process.env.REDIS_URL,
socket: {
tls: true,
rejectUnauthorized: false
})
我的 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]: }
链接 #1https://help.heroku.com/45F0AY28/what-are-the-upcoming-changes-to-the-redis_url-config-var-for-heroku-key-value-store-mini-add -onhttps://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