我正在使用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
答案 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(...){...}
注意强>: