我正在开发一个使用CAS验证的Web应用程序(单点登录解决方案:http://www.ja-sig.org/wiki/display/CAS/Home)。
出于安全考虑,我需要做两件事:
这是我到目前为止所得到的:
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证书。
我希望有人可以帮助我,或者告诉我一个按照我需要的方式工作的宝石。
感谢。
答案 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