ruby-on-rails - 证书错误 SSL_connect returned=1 errno=0 state=error : certificate verify failed

标签 ruby-on-rails ssl

我正在使用一个 ruby​​/rails 应用程序,它通过 rest/API 从另一个 ruby​​/rails 应用程序接收一些信息。

第二个 Rails 应用程序的地址如下:https://railsapp2.domain.org (这是我在我的第一个应用程序中使用的授权网址)

但是当作业在我的第一个应用程序上运行时出现错误。

错误是:SSL_connect returned=1 errno=0 state=error: certificate verify failed

我认为问题是因为我的应用程序中的这段代码:

 def self.fetch(url)
   authorized_url = RemoteRequestBuilder.authorize_and_decorate!(url)

   RestClient.get(authorized_url, { accept: :json }) { |response, request, result, &block|
    raise SparcApiError unless response.code == 200

    @response = response
  }

  Yajl::Parser.parse @response
end

我寻找了一些答案,发现我可以使用 verify_ssl: false ,但我不知道在哪里使用它。以及如何使用 verify_ssl 使其工作:true。

我还安装了经过认证的 gem,但它不会改变输出中的任何内容。

我正在使用 centOS7。

编辑

所以我这样做了

   RestClient::Resource.new(
   authorized_url,
   :ssl_client_cert  => OpenSSL::X509::Certificate.new(File.read("/etc/certs/mycert.pem")),
   :ssl_client_key   =>  OpenSSL::PKey::RSA.new(File.read("/etc/private/mykey.key")),
   :ssl_ca_file      =>  "/etc/certs/mycert.pem",
   :verify_ssl       =>  OpenSSL::SSL::VERIFY_PEER
   ).get(authorized_url, { accept: :json }) { |response, request, result, &block|
  raise SparcApiError unless response.code == 200

  @response = response
}

现在它在 get 中给出了错误的参数数量错误。

|参数数量错误(2 表示 0..1) /home/capistrano/opt/shared/bundle/ruby/2.1.0/gems/rest-client-2.0.2/lib/restclient/resource.rb:49:in `get'

所以我从 get 中删除了 authorized_url 参数,然后它开始给我错误证书验证失败。

所以我放

 :verify_ssl       =>  OpenSSL::SSL::VERIFY_NONE

现在它给我错误:连接由对等方重置 - SSL_connect

最佳答案

根据 documentation Rest-Client gem

RestClient::Resource.new(
  'https://example.com',
  :ssl_client_cert  =>  OpenSSL::X509::Certificate.new(File.read("cert.pem")),
  :ssl_client_key   =>  OpenSSL::PKey::RSA.new(File.read("key.pem"), "passphrase, if any"),
  :ssl_ca_file      =>  "ca_certificate.pem",
  :verify_ssl       =>  OpenSSL::SSL::VERIFY_PEER
).get

可用于指定 ca-certificate 并验证它们。如果您不想验证它,请将 verify-ssl 键修改为 OpenSSL::SSL::VERIFY_NONE

根据 RestClient.get() 的 RestClient gem 源代码和 RestClient::Resource.new(...).get , 这两种方法都调用 Request.execute() .因此,您的参数将保持不变,除非您需要将授权的 url 传递给 .new 的参数。所以你的代码会变成这样:

my_client = RestClient::Resource.new(
  authorized_url,
  :ssl_client_cert  =>  OpenSSL::X509::Certificate.new(File.read("cert.pem")),
  :ssl_client_key   =>  OpenSSL::PKey::RSA.new(File.read("key.pem"), "passphrase, if any"),
  :ssl_ca_file      =>  "ca_certificate.pem",
  :verify_ssl       =>  OpenSSL::SSL::VERIFY_PEER
)

my_client.get({ accept: :json }) { |response, request, result, &block|
    raise SparcApiError unless response.code == 200

    @response = response
  }

这样,您可以重新使用 my_client 对象来发送具有相同 ssl 选项和 url 的 GET/POST/PUT/PATCH/DELETE 请求。例如my_client.post(...){...}


注意:

  1. 不应在生产中跳过验证 ssl 证书。这应该仅在开发/测试环境中使用,否则您将容易受到中间人攻击。
  2. 如果您信任 CA 证书,则应将其添加到主机安装的证书包中。

关于ruby-on-rails - 证书错误 SSL_connect returned=1 errno=0 state=error : certificate verify failed,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48677993/

相关文章:

ruby-on-rails - 缓存在 rake 任务中的 ActiveRecord 模型?

ruby-on-rails - 如何使用 ruby​​-debug gem 调试插件或 gem,我想调试的部分是从测试脚本开始的?

ssl - 如何强制 'OpenConnect' 客户端使用 TLS 1.0

ssl - IBM Web 服务器中从 http 到 https 的 url 重定向

ruby-on-rails - 在 Windows 上安装 Puma 错误

html - 页面上的多个 form_fors 导致 _method 属性出现问题

ruby-on-rails - 工头不会杀死进程

ruby-on-rails - 如何将模块包含到类中,以便模块覆盖类?

apache - 子域使用 HTTPS 显示错误内容

c - OpenSSL openwrt 套接字绑定(bind)失败