证书错误SSL_connect返回= 1 errno = 0状态=错误:证书验证失败

时间:2018-02-08 05:10:32

标签: ruby-on-rails ssl

我正在使用ruby / rails应用程序,它通过其他ruby / rails应用程序的rest / API收到一些信息。

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

但是当我的第一个应用程序上运行作业时,我收到错误。

错误是:SSL_connect返回= 1 errno = 0状态=错误:证书验证失败

我相信问题是因为我的应用中的代码:

 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来使其工作。

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

我正在使用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

现在它给了我错误:通过peer重置连接 - SSL_connect

1 个答案:

答案 0 :(得分:1)

根据Rest-Client gem的documentation

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::Resource.new(...).get的RestClient gem源代码,这两种方法都会调用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选项和网址的GET/POST/PUT/PATCH/DELETE个请求。例如my_client.post(...){...}

注意

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