一个“中心位置”,用于明确设置SSL证书变量

时间:2011-03-02 22:11:24

标签: ruby-on-rails ruby ruby-on-rails-3 variables global-variables

我正在使用Ruby on Rails 3,我希望有一个“中心位置”,可以在我的应用程序中明确设置SSL证书。

几乎在代码中的任何地方我都有这样的HTTPS请求

e = Typhoeus::Request.get("https://example.com/action",
  :ssl_cacert => "ca_file.cer",
  :ssl_cert => "acert.crt",
  :ssl_key => "akey.key",
  [...]
end

因此,为了为我的所有请求指定SSL证书,我想设置一个全局变量(我听说全局变量可能很危险......)或类似的东西以安全的方式。

2 个答案:

答案 0 :(得分:2)

您可以构建一个SSL帮助程序类,并使用它(我将它放在lib中,但这主要只是用户首选项):

class MySSL
    SSL_DEFAULTS = {
        :ssl_cacert => 'ca_cert.cer',
        :ssl_cery => 'acert.crt',
        :ssl_key => 'akey.key'
    }

    def self.get(uri, options = {})
        options.reverse_merge!(SSL_DEFAULTS)
        Typhoeus::Request.get(uri, options)
    end

    # And so forth for post, etc.
end

其中reverse_merge!是一个方便的Rails扩展,为哈希提供默认选项(如果原始哈希已经具有这些键,则不会覆盖它们)。您也可以通过使用类常量来避免设置全局变量。在其余代码中,您可以调用

MySSL.get('https://example.com/action')

MySSL.get('https://example.com/action', :other => :options)
相比之下,它更清洁了。

希望这有帮助!

答案 1 :(得分:0)

您可以使用OpenSSL::SSL::SSLContext::DEFAULT_CERT_STORE方法#add_file#add_path将其设置在默认的证书存储区中;这将被几乎所有不会覆盖它的东西所吸引,特别是Net :: HTTP。我不确定Typhoeus,但它应该有效,只要它不会改变它。