- 降级到Redis 5。
- 在
redis-py
中将ssl_cert_reqs = None
传递给Redis
构造函数。
- 说明如何在Heroku Redis高级版计划上禁用TLS证书验证。
- 说明如何在Heroku Redis高级版计划上使TLS证书验证正常工作。
redis-py
中将ssl_cert_reqs = None
传递给Redis
构造函数。我通过在我的Heroku配置文件的REDIS_URL
末尾添加?ssl_cert_reqs=CERT_NONE
解决了我的问题。
您可以通过降级到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认证。
文档实际上是错误的,您必须将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
我在这个问题上遇到了困难,但最终解决了...
关于这个主题的很多文档和帖子都不够清晰。我已请求Heroku更新他们的文档https://devcenter.heroku.com/articles/connecting-heroku-redis#connecting-in-python以包括对Procfile
的特定更改。
虽然上面提到了这点,但是它指的是“Heroku config”而不是Procfile
。
在您的Procfile
中添加?ssl_cert_reqs=none
到$REDIS_URL
。
e.g.:
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')
django-rq
中遇到了同样的问题,你的解决方案帮了我大忙! - PythonSherpaimport os, redis
redis_url = os.getenv('REDIS_URL')
redis_store = redis.from_url(redis_url, ssl_cert_reqs=None)
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
该解决方案适用于nodejs16和redis客户端4.6.x
redisClient = redis.createClient({
url: process.env.REDIS_URL,
socket: {
tls: true,
rejectUnauthorized: false
})
?ssl_cert_reqs=none
时,它对我起作用了(CERT_NONE引发了“无效标志”错误)。 - jtschoonhovenconfig.py
文件中将?ssl_cert_reqs=none
添加到 Redis URL 中。 - Rob