如何使用 net/http 在 ruby​​ 中验证 SSL 证书链

Posted

技术标签:

【中文标题】如何使用 net/http 在 ruby​​ 中验证 SSL 证书链【英文标题】:How to validate SSL certificate chain in ruby with net/http 【发布时间】:2011-01-31 06:18:28 【问题描述】:

如何使用 net/http 在 ruby​​ 中验证 https://processing.ukash.com/ 等网站的证书?

https = Net::HTTP.new('processing.ukash.com', 443)
https.use_ssl = true
https.verify_mode = OpenSSL::SSL::VERIFY_NONE

到目前为止有效,但我现在如何验证它是正确的证书?我从 firefox 中保存了证书,但生成的 .pem 文件中有很多证书,net/http 似乎不喜欢它。

【问题讨论】:

【参考方案1】:

来自我的代码 sn-ps 集合:

#!/usr/bin/env ruby
# How to:
# =======
# Use Ruby's net/https library, to verify a SSL certificate.
# ==========================================================
# - Without verification the following code will lead to:
# warning: peer certificate won't be verified in this SSL session
#
# #------------------begin example-----------------------------
# require 'net/http'
# require 'net/https'
# require 'uri'
# 
# url = URI.parse 'https://myname:mypass@mail.google.com/'
# http = Net::HTTP.new(url.host, url.port)
# http.use_ssl = (url.scheme == 'https')
# request = Net::HTTP::Get.new(url.path)
# request.basic_auth url.user, url.password
# response = http.request(request)
# #-------------------end example------------------------------
# 
#  To verify the ssl cert cosider adapting the following.
# Status: Untested
# =======
#
# References:
# ===========
# [1] http://mimori.org/%7Eh/tdiary/20080301.html#p03
# [2] http://redcorundum.blogspot.com/2008/03/ssl-certificates-and-nethttps.html
#
require 'net/http'
require 'net/https'
require 'uri'

RootCA = '/etc/ssl/certs'

url = URI.parse 'https://myname:mypass@mail.google.com/'
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = (url.scheme == 'https')
if (File.directory?(RootCA) && http.use_ssl?)
  http.ca_path = RootCA
  http.verify_mode = OpenSSL::SSL::VERIFY_PEER
  http.verify_depth = 5
else
  http.verify_mode = OpenSSL::SSL::VERIFY_NONE 
end
request = Net::HTTP::Get.new(url.path)
request.basic_auth url.user, url.password
response = http.request(request)

希望这有帮助吗?

【讨论】:

我要求粘贴永远粘贴,但不知道。无论如何,链接:pastebin.mozilla.org/1460391 很容易成为我。我还没有真正研究它。 现在执行 :) 当我 pp 得到响应时,我得到 #<:httpok ok readbody="true"> 但是,我有点忘记了重点是什么。唔。也许这个问题有点令人失望。好的,好吧,这很有趣并且可以执行。加一个! 我认为关键是在 devops 设置中,您需要编写可执行规范,这些规范不仅要描述基础设施拥有/是什么 - 而且还要验证它实际上是可操作的 - 因此需要验证 SSL证书。 HTH 样本的问题是它没有输出,所以你不知道它是否有效。我没有得到任何输出,并认为它正在工作,但实际上它只是禁用了验证,因为我将RootCA 设置为一个文件,所以File.directory? 测试是错误的。 @drewish 我不确定我是否关注。当您说“我没有得到任何输出”时,您的意思是 response.nil? 返回真吗?还有什么?【参考方案2】:

为了完整起见,为了我未来的我,这是我用它制作的一个小宝石:https://github.com/jarthod/ssl-test

【讨论】:

以上是关于如何使用 net/http 在 ruby​​ 中验证 SSL 证书链的主要内容,如果未能解决你的问题,请参考以下文章

支付宝PC扫码支付在Safari浏览器中验签失败(invalid-signature)

如何使用 Ruby on Rails 发出 HTTP 请求?

Ruby:Net::HTTP 空闲超时?

带有 Ruby 的 Imdb api

如何使用 Paypal 的 Adaptive Payments API 和 Ruby 来避免身份验证和时间问题?

使用 Ruby 发送自定义 HTTP 标头