问题
在我的Ruby on rails应用程序上,我不断收到Heroku Redis Premium 0附加组件的以下错误:
Openssl::ssl::SSLError:SSL_CONNECT返回=1 errno=0状态=错误:证书验证失败(证书链中的自签名证书)
Heroku Redis文档提到,为了连接到Redis6数据库,我需要在Redis客户端的配置中启用TLS。为了实现这一点,我阅读了关于redis-RB的SSL/TLS支持文档。我的理解是,我需要为Redis.new#ssl_params
分配ca_file
、cert
和key
。问题是如何为Redis或通过Heroku上的Sidekiq设置这些?
更新
更新3:Heroku支持提供了解决问题的答案。
更新2:创建了Heroku支持票证和等待响应。
更新1:Asked关于Sidekiq的Github问题,并被建议去写Heroku支持。当我得到答案时,我会更新这个问题。
相关信息
我已经验证了该应用程序在以下两种情况之一的情况下确实可以工作:
- 业余爱好-Redis 6的开发人员
- Redis 5的高级版0
版本:
- Ruby-3.0.0p0
- Ruby on Rails-6.1.1
- Redis-6.0
- REDIS-RB-4.2.5
- Sidekiq-6.2.1
- Heroku Stack-20
一些链接帮助我缩小了问题的范围:
3条答案
按热度按时间ldioqlga1#
解决方案
将
OpenSSL::SSL::VERIFY_NONE
用于您的Redis客户端。Sidekiq
Redis
原因
Redis 6需要TLS才能连接。然而,Heroku Support解释说,他们管理从路由器级别到应用程序级别的涉及自签名证书的请求。事实证明,Heroku在路由器级别终止了SSL,请求从那里通过HTTP转发到应用程序,而一切都在Heroku的防火墙和安全措施之后。
来源
svdrlsy42#
如果您使用ActionCable,则可能还需要将
verify_mode
添加到`cable.yml配置:来源:https://github.com/chatwoot/chatwoot/issues/2420
gxwragnw3#
如果您使用的是rails 5,您将无法通过
cable.yml
文件为ActionCable配置Redis的ssl_params
。相反,您可以在初始化式中手动设置redis_connector
属性,如下所示:更多关于使用
OpenSSL::SSL::VERIFY_NONE
的含义以及为什么如果你使用Heroku可能没有问题的上下文:使用
OpenSSL::SSL::VERIFY_NONE
告诉客户端可以使用自签名证书,不会尝试验证该证书是否由已知的证书颁发机构签署。那里有可能发生中间人袭击。如果试图与Heroku Redis对话的客户端没有验证它遇到的SSL证书是否属于Heroku(AKA,这些证书是由已经验证了请求证书的实体实际上是Heroku的证书颁发机构签署的),那么位于您的客户端和Heroku Redis之间的攻击者可以创建他们自己的自签名SSL证书,并假装是Heroku。这意味着他们可能会拦截你试图发送给Heroku Redis的任何流量。
在实践中,这可能不是一个赫罗库·达诺与赫罗库·雷迪斯对话的现实场景。
以下是Heroku Support的一句话:
MITM攻击在托管主机提供商上是不切实际的。对于一个糟糕的演员来说,很难在dyno和托管在AWS上的Redis示例之间进行切换。这是因为同一AZ中的EC2示例在任何时候都不应路由到AWS基础设施之外。在这种情况下,MITM攻击只能由托管服务提供商的设施本身内的不良行为者执行,因为网络流量从未离开所述设施。
以下是AWS文档中的一些片段,似乎证实了这一点:
https://aws.amazon.com/vpc/faqs/
问:当两个示例使用公共IP地址通信时,或者当示例与公共AWS服务端点通信时,流量是否通过互联网?
不是的。使用公共地址空间时,AWS中托管的示例和服务之间的所有通信都使用AWS的私有网络。来自AWS网络且目的地在AWS网络上的信息包将保留在AWS全球网络上,但进出AWS中国区域的流量除外。
此外,通过AWS全球网络互联我们的数据中心和地区的所有数据在离开我们的安全设施之前,都会在物理层自动加密。此外,还存在其他加密层;例如,所有vPC跨区域对等流量以及客户或服务到服务的传输层安全(TLS)连接。
和https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-vpc.html
亚马逊虚拟私有云(Amazon VPC)使您能够在AWS云内您自己的逻辑隔离区域中定义虚拟网络,称为虚拟私有云(VPC)。
当您创建您的AWS帐户时,我们会在每个区域为您创建一个默认VPC