1

我正在将一段代码从 Ruby 1.8.7 移植到充当 SOAP 客户端的 Ruby 1.9.3。客户端与使用自签名证书的服务器通信(在本例中位于同一台机器上),但是每当我执行 SOAP 调用时,它都会失败并显示OpenSSL::SSL:SSLError

/root/.rvm/gems/ruby-1.9.3-p448/gems/httpclient-2.3.4.1/lib/httpclient/session.rb:303:
in `connect': SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B:
certificate verify failed (OpenSSL::SSL::SSLError)

我已经尝试通过 gem 安装soap4r(然后我不得不破解它才能正确地要求它)。正如其他 SO 问题所建议的那样,我还尝试安装 spox repo 版本:

mkdir -pv ${APPSCALE_HOME}/downloads
cd ${APPSCALE_HOME}/downloads
git clone https://github.com/spox/soap4r-spox.git
cd soap4r-spox
ruby setup.rb all
cd ..
rm -rf soap4r-spox

这也因同样的问题而失败。我在 Ubuntu Precise 上,所以我尝试通过 apt 和 RVM 安装 Ruby 1.9.3,它们也有同样的问题。最后,由于我有 RVM,我也尝试使用 Ruby 2.0.0,它也有同样的问题。

我可以很好地连接到其他网站(例如,google、rubygems),所以它看起来不像我看到的其他报告关于他们的证书位于 Ruby 看不到的地方的相同问题。有任何想法吗?当然,我使用的代码是(为了便于阅读而截断):

require 'openssl'
require 'soap/rpc/driver'

class UserAppClient
  attr_reader :conn, :ip, :secret


  # The port that the UserAppServer binds to, by default.
  SERVER_PORT = 4343


  def initialize(ip, secret)
    @ip = ip
    @secret = secret

    @conn = SOAP::RPC::Driver.new("https://#{@ip}:#{SERVER_PORT}")
    @conn.add_method("get_all_apps", "secret")
  end

  def get_all_apps(retry_on_except=true)
    all_apps = @conn.get_all_apps(@secret)
    app_list = all_apps.split(":")
    app_list = app_list - [app_list[0]] # first item is a dummy value
    return app_list
  end
end
4

0 回答 0