我正在使用一个 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(...){...}
注意:
- 不应在生产中跳过验证 ssl 证书。这应该仅在开发/测试环境中使用,否则您将容易受到中间人攻击。
- 如果您信任 CA 证书,则应将其添加到主机安装的证书包中。
关于ruby-on-rails - 证书错误 SSL_connect returned=1 errno=0 state=error : certificate verify failed,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48677993/