如何在调用URI时验证SSL连接?

时间:2010-04-30 12:21:19

标签: ruby-on-rails ruby https openssl

我正在开发一个使用CAS验证的Web应用程序(单点登录解决方案:http://www.ja-sig.org/wiki/display/CAS/Home)。

出于安全考虑,我需要做两件事:

  • CAS与我的应用程序之间的通信需要安全
  • 我的应用程序需要接受来自CAS的认证,以便我可以保证CAS响应是真正的CAS服务器

这是我到目前为止所得到的:

uri = URI.parse("https://www.google.com/accounts")
https = Net::HTTP.new(uri.host, uri.port)
https.use_ssl = (uri.scheme == 'https')
https.verify_mode = (OpenSSL::SSL::VERIFY_PEER)
raw_res = https.start do |conn|
  conn.get("#{uri.path}?#{uri.query}")
end

这在Mac OS X中运行得非常好。当我尝试访问不安全的URI时,会引发异常,当我尝试访问安全URI时,它会正常地允许我,就像预期一样。

当我在Linux服务器上部署应用程序时,问题就开始了。我试过Ubuntu和Red Hat。独立于我尝试访问的URI,它总是引发此异常:

OpenSSL::SSL::SSLError: SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed
    from /usr/local/lib/ruby/1.8/net/http.rb:586:in `connect'
    from /usr/local/lib/ruby/1.8/net/http.rb:586:in `connect'
    from /usr/local/lib/ruby/1.8/net/http.rb:553:in `do_start'
    from /usr/local/lib/ruby/1.8/net/http.rb:542:in `start'
    from (irb):7

我认为这与我安装的OpenSSL软件包有关,但我无法确定。这是我安装的OpenSSL包:

openssl.x86_64                              0.9.8e-12.el5              installed
openssl-devel.x86_64                        0.9.8e-12.el5              installed

我也尝试过使用HTTParty,但它只是忽略了SSL证书。

我希望有人可以帮助我,或者告诉我一个按照我需要的方式工作的宝石。

感谢。

2 个答案:

答案 0 :(得分:1)

我敢打赌,证书颁发机构文件存在差异。尝试将https.ca_file设置为另一个pem文件like maybe this one,并确保您的证书CA位于该列表中。

或者,也许一台或两台机器的时钟都是错误的。 (通过this page

  

检查之间的时钟   puppetmaster和客户端同步,   如果客户端落后了   生成证书,然后   客户端看到的开始日期   证书是将来的   因此无效。只为   参考,你可以找到这个信息   来自证书使用以下内容:

     

openssl x509 -text -noout -in   /var/lib/puppet/ssl/certs/hostname.tld.pem   | grep -A2有效性

    Validity
        Not Before: Apr 19 23:21:29 2009 GMT
        Not After : Apr 18 23:21:29 2014 GMT

答案 1 :(得分:-4)

http.verify_mode = OpenSSL :: SSL :: VERIFY_NONE