代码之家  ›  专栏  ›  技术社区  ›  robertokl

如何在调用uri时验证ssl连接?

  •  1
  • robertokl  · 技术社区  · 14 年前

    我正在开发一个使用cas(单一登录解决方案: 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
    

    这在MacOSX中非常有效。当我尝试访问一个不安全的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 回复  |  直到 14 年前
        1
  •  1
  •   John Douthat    14 年前

    我敢打赌,证书颁发机构文件中肯定有差异。尝试设置 https.ca_file 另一个PEM文件, like maybe this one ,并确保证书的ca在该列表中。

    或者,也许机器的一个或两个时钟都错了。(通过 this page )

    检查一下 PuppetMaster和客户端同步, 如果客户在 生成证书,然后 客户看到 证书在未来 因此无效。只是为了 参考你可以找到这个信息 从证书中使用以下命令:

    openssl x509-文本-noout-输入 /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
    
        2
  •  -4
  •   cloverink    14 年前

    http.verify_mode=openssl::ssl::verify_none