用于 Elasticsearch 的 Faraday::SSLError

Posted

技术标签:

【中文标题】用于 Elasticsearch 的 Faraday::SSLError【英文标题】:Faraday::SSLError for Elasticsearch 【发布时间】:2016-12-16 04:04:42 【问题描述】:

目前遇到一个问题,即通过 elasticsearch-client 与 elasticsearch 通信的后台工作人员在 Faraday 内部遇到 SSL 错误。

错误是这样的:

SSL_connect returned=1 errno=0 state=SSLv3 read server hello A: sslv3 alert handshake failure

配置在某些时候运行良好(大约 50%),并且在控制台会话中对我来说从未失败过。

命令的痕迹是这样的: curl -X GET 'https://<host>/_alias/models_write?pretty

客户端配置是这样的

Thread.current[:chewy_client] ||= begin
  client_configuration[:reload_on_failure] = true
  client_configuration[:reload_connections] = 30
  client_configuration[:sniffer_timeout] = 0.5
  client_configuration[:transport_options] ||= 
  client_configuration[:transport_options][:ssl] =  :version => :TLSv1_2 
  client_configuration[:transport_options][:headers] =  content_type: 'application/json' 
  client_configuration[:trace] = true
  client_configuration[:logger] = Rails.logger
  ::Elasticsearch::Client.new(client_configuration) do |f|
    f.request :aws_signers_v4,
              credentials: AWS::Core::CredentialProviders::DefaultProvider.new,
              service_name: 'es',
              region: ENV['ES_REGION'] || 'us-west-2'
  end
end

如您所见,我将 ssl 版本明确设置为 TSLv1_2,但仍然收到 SSLv3 错误。

认为可能是比赛条件问题。所以运行了一个脚本,产生了大约 10 个进程,每个进程有 50 个线程,并在内部调用 sidekiq perform 方法,但仍然无法重现。

我正在使用托管的 AWS 2.3 Elasticsearch,如果这完全相关的话。

我们将不胜感激任何正确方向的帮助或指导,我很乐意根据需要附上尽可能多的信息。

【问题讨论】:

【参考方案1】:

想通了。问题是 elasticsearch-ruby gem 会自动加载到一个 http 适配器中,如果没有指定它,它会检测到它。在我的控制台中使用的那个不是自动加载到 sidekiq 中的那个。

sidekiq 作业正在使用不遵守 SSL 版本选项的 HTTPClient 适配器。因此我收到了这个错误。在明确定义法拉第适配器后,它就可以工作了。

【讨论】:

以上是关于用于 Elasticsearch 的 Faraday::SSLError的主要内容,如果未能解决你的问题,请参考以下文章

用于 Elasticsearch 的 Faraday::SSLError

用于审计跟踪的 Elasticsearch

如何改进Elasticsearch用于日志分析?

用于 Elasticsearch 的替代异常检测引擎

Elasticsearch 集群不适用于 Docker Swarm

聚合结果的 Elasticsearch 过滤器(用于搜索和聚合)