6

我正在尝试使用 Ruby EventMachine 访问使用 SSL 证书身份验证的 HTTPS Web 服务,但我没有让它工作。

我编写了以下简单的代码块来对其进行端到端测试:

require 'rubygems'
require 'em-http'

EventMachine.run do
  url = 'https://foobar.com/'
  ssl_opts = {:private_key_file => '/tmp/private.key',
    :cert_chain_file => '/tmp/ca.pem',
    :verify_peer => false}
  http = EventMachine::HttpRequest.new(url).get :ssl => ssl_opts

  http.callback do
    p http.response_header.status
    p http.response_header
    p http.response
    EventMachine.stop
  end

  http.errback do
    EventMachine.stop
    fail "Request failed"
  end
end

运行上述输出,<SSL_incomp>然后运行引发的 RuntimeError 消息。我尝试将:verify_peerset 设置为 true 和 false 运行,它给了我同样的错误。EventMachine::HttpRequest#get不带:ssl选项运行也是如此。

我还尝试在没有选项的情况下将请求发送到 GMail ( https://mail.google.com ) :ssl(即没有证书的普通 HTTPS),并且可以输出状态代码 200、标题和正文。

我尝试使用 curl 对 Web 服务执行相同的请求,并且有效:

curl --silent --cert /tmp/private.key --cacert /tmp/ca.pem https://foobar.com/

我在想我要么错误地使用了 em-http-request gem 或 EventMachine,要么 SSL 文件的格式适用于 curl 但不适用于 EventMachine。

我有人知道如何解决上面的示例或直接使用 EventMachine 提供类似的示例将不胜感激!

4

1 回答 1

3

传递给 curl 的文件--cert包含证书和密钥(除非您--key单独传递)。只需用作两者的/tmp/private.key论据:private_key_file:cert_chain_file

请参阅http://github.com/eventmachine/eventmachine/issues/#issue/115以获取有关该问题的更多详细信息以及暴露潜在错误的补丁(而不仅仅是打印出 SSL_incomp)。

于 2010-10-31T05:17:52.320 回答