2009-07-11 132 views
41

我嘗試通過https連接訪問open-uri文件。不幸的是,有些證書錯誤,我得到一個證書驗證失敗錯誤。我無法做任何事情,所以我必須繞過驗證。如何在open-uri中繞過SSL證書驗證?

我發現這個answer

我不想/不能改變在服務器上OEN-uri.rb,和我運行的Ruby 1.8.6。

如何更改驗證模式?或者更確切地說我在哪裏改變它?

我可以把這個放在哪裏?

if target.class == URI::HTTPS 
require 'net/https' 
http.use_ssl = true 
http.verify_mode = OpenSSL::SSL::VERIFY_NONE 
store = OpenSSL::X509::Store.new 
store.set_default_paths 
http.cert_store = store 
end 

還是骯髒的黑客:我可以把這個放在哪裏?

OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE 

回答

59

如果你真的不想使用證書驗證的額外的安全性,並可以升級到Ruby 1.9.3p327 +,你可以傳遞ssl_verify_mode選項將open方法。這裏有個例子是我如何做它:

request_uri=URI.parse('myuri?that_has=params&encoded=in_it&optionally=1') 

# The params incidentally are available as a String, via request_uri.query 
output = open(request_uri, {ssl_verify_mode: OpenSSL::SSL::VERIFY_NONE}) 
obj = JSON.parse output.readlines.join("") 
38

現在發現我自己:我用了骯髒的黑客,這對我來說工作得很好。

我不得不把它分爲:yourrailsapp/initalizers/

在那裏,我創建了一個bypass_ssl_verification_for_open_uri.rb

並提出:

OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE 
+8

如果出現'動態常量賦值'錯誤,請執行以下操作:OpenSSL :: SSL.const_set(:VERIFY_PEER,OpenSSL :: SSL :: VERIFY_NONE) – Sam 2014-02-04 18:58:17

+3

並且爲了避免出現警告:已經初始化常量OpenSSL :: SSL :: VERIFY_PEER`警告,使用`remove_const`首先刪除該常量,然後重新添加。這很難輸入到註釋中,所以[請查看這個要點](https://gist.github.com/siruguri/66926b42a0c70ef7119e)。 – sameers 2015-04-14 18:50:05

+0

如果您使用的是ruby 1.9.3p327 + – jvenezia 2015-04-27 13:46:19

1

似乎是一個很好的候選列入environment.rb中,如果此黑客只在特定的環境中使用,然後在他們的個人配置文件中使用。

13

它的好(可能產卵uninitialized constant OpenSSL (NameError))把需要在該行之前 'OpenSSL的',所以

應用程序/配置/初始化/ bypass_ssl_verification_for_open_uri.rb(初始化的文件名沒有按」物質)

require 'openssl'
OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE

3

弱,但可控制的方式是

class XMLRPC::Client 
# WEAK: Enrich the Client with a method for disabling SSL VERIFICATION 
# See /usr/lib/ruby/1.9.1/xmlrpc/client.rb:324 
# Bad hack but it works 
def disableSSLVerification 
    @http.verify_mode = OpenSSL::SSL::VERIFY_NONE 
    warn "Proxyman SSL Verification disabled" 
end 
end 

然後你只需撥打

client.disableSSLVerification() 
9

至於你提到自己,這是一個骯髒的黑客。顯然,禁用SSL證書驗證不是一個好主意。

MislavMarohnić提供了非常有用的article,詳細解釋了爲什麼這很糟糕以及如何正確解決這個問題。

總之,你大多得到了SSL驗證,如果錯誤:

  1. 證書是有效的,但你的系統沒有驗證所需的根證書。
  2. 該證書是自簽名的,例如,在你的公司,你需要信任它
  3. 你受到中間人攻擊

對我來說,第一種情況下應用,只需更新CA證書包我的Ubuntu系統做到了這一點。

查找SSL錯誤的好工具是ssl doctor script

3

這是您的電話,但將VERIFY_PEER設置爲NONE基本上等效於 以完全禁用TLS並通過純文本HTTP進行連接。這讓中間人攻擊變得微不足道,並且不會通過PCI審計。