0

我正在使用Ruby on Rails 3,我希望有一個「中心位置」,以便在我的應用程序中明確設置要使用的SSL證書。一個「中心位置」,明確設置SSL證書變量

在代碼中幾乎無處不在我有這樣

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

所以HTTPS請求,以指定爲我所有的請求的SSL證書,我想設置一個全局變量(我聽說,全局變量可以是危險的......)或類似的東西以安全的方式。

回答

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) 

其中很多更清潔,比較。

希望這會有所幫助!

+0

出於安全原因,例如,是否建議'凍結'在類常量'SSL_DEFAULTS'上做其他事情? – user502052 2011-03-03 07:31:05

+0

@ user502052可能是個好主意。這不是爲了安全 - 你不會讓外國代碼在你的應用中運行,我希望你是唯一能夠改變值的人 - 但它會讓你不小心改變事情。特別是'SSL_DEFAULTS [:key] ='hullabaloo'不會引發警告,即使'SSL_DEFAULTS'是一個常量。乾杯! – 2011-03-03 20:38:18

+0

有關此主題的另一個「快速」問題:建議在'environment.rb'文件中,'/ initializer /'文件或'/ environments /'文件中聲明SSL全局變量,而不是在內部執行該變量班級(和你一樣)?如果是這樣,如何做到這一點,使變量在所有的應用程序可訪問? – user502052 2011-03-06 21:53:55

0

您可以使用OpenSSL::SSL::SSLContext::DEFAULT_CERT_STORE方法#add_file#add_path將其設置在默認證書存儲區;這將會被幾乎所有不會覆蓋它的東西所取代,特別是Net :: HTTP。我不知道Typhoeus,但它應該工作,只要它不改變它。