Faraday :: Elasticsearch的SSLError

时间:2016-08-09 23:39:47

标签: ruby-on-rails ruby ssl elasticsearch elasticsearch-ruby

目前遇到的问题是我的后台工作人员通过elasticsearch-client与elasticsearch进行通信,在法拉第内部遇到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执行方法,但仍然无法重现。

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

非常感谢任何正确方向的帮助或指导,我很乐意根据需要附上尽可能多的信息。

1 个答案:

答案 0 :(得分:0)

想出来。问题是elasticsearch-ruby gem在一个http适配器中自动加载,它会检测是否未指定。在我的控制台中使用的那个不是自动加载到sidekiq的那个。

sidekiq作业使用的HTTPClient适配器不支持SSL版本选项。因此我收到了这个错误。在明确定义了法拉第适配器之后,它就起作用了。