2010-06-14 89 views
10

我正在使用Ruby/Rails處理SAML網關,並試圖編寫一些代碼來驗證傳入SAML響應的xml digital signature與源服務的x509證書的對比。在Ruby中規範化XML

我的問題:簽名取決於經過哈希處理然後簽名的XML的規範化版本,而且我無法找到將通過the spec規範化XML的ruby lib/gem。我發現一個super old gem on rubyforge這是一團糟,但如果像nokogiri這樣的功能支持這種功能(來自nokogiri文檔,它不支持),我會更感興趣。

我已經廣泛使用Google搜索,但認爲我會在此處詢問是否有人在我去之前嘗試編寫我自己的版本或返工現有的c14n-r庫。

+0

有一個[XMLDSIG(https://github.com/benoist/xmldsig)寶石覈實並簽署XML文檔。 – Chloe 2013-07-29 23:53:45

回答

5

給這兩種寶石一拍:

http://rubygems.org/gems/coupa-libxml-ruby

http://rubygems.org/gems/xmlsec-ruby

我寫了他們的SAML項目。第一個補丁libxml-ruby爲基本C庫中的canonicalize函數添加綁定。

後者是xmlsec的ruby綁定。現在,所有這些工作都是簽名驗證,這是我所需要的項目,但它聽起來像它也適合您的需求。

我建議使用xmlsec,因爲試圖編寫自己的XML簽名驗證代碼是徒勞無益的。等待直到你必須處理多重封裝簽名,嵌入式證書,gah。讓xmlsec處理這個垃圾。

+0

感謝提示人;我會嘗試xmlsec lib。不幸的是,nokogiri推遲了c14n的支持,直到1.4.4版本發佈,但最近發佈了,我也沒有看到它。它可能已經被推回到1.5。在此期間,我會試試這個! – whazzmaster 2010-12-15 14:53:56

+1

爲了記錄,Nokogiri現在支持canonicalize:http://nokogiri.org/Nokogiri/XML/Document.html#method-i-canonicalize – jBilbo 2012-07-09 17:35:23

+0

libxml-ruby也集成了canonicalize方法。 http://xml4r.github.io/libxml-ruby/rdoc/classes/LibXML/XML/Document.html#method-i-canonicalize – Chloe 2013-05-09 02:50:50

0

我有一個的Ruby/Rails服務提供商與.NET(ComponentSoft)IDP

這個工作對我來說(我曾與XML的規範化版本沒有任何問題):

received_certificate = XPath.first(response_document,"//samlp:Response//Signature//KeyInfo//X509Data//X509Certificate").text 

def self.verify_signature(received_certificate, idp_certificate_path) 
    certificate ||= OpenSSL::X509::Certificate.new(File.read(idp_certificate_path)) 
    cert_decoded = Base64.decode64(received_certificate) 
    cert = OpenSSL::X509::Certificate.new(cert_decoded) 
    certificate.verify(cert.public_key) 
end 
+0

我想這不是你的問題...... – Mada 2010-06-15 17:10:09

+1

正確 - 我需要使用X509證書驗證已簽名的內容與消化的內容。上面的代碼將驗證X509證書與它所做的相符,但除非您驗證,否則您不知道該消息是否源自該證書。 – whazzmaster 2010-06-15 21:30:35

+0

我發現了幾個可能有所幫助的鏈接: http://github.com/onelogin/ruby-saml/blob/master/lib/xml_sec.rb http://rubygems.org/gems/XMLCanonicalizer http:// rubygems.org/gems/saml2ruby – Mada 2010-06-17 18:59:08

1

後環顧更多,我發現nokogiri已經在next release的todo列表上提供了c14n支持。不知道更多 - 但是從2010年6月起,似乎沒有廣泛使用的XML庫支持c14n。由於沒有真正彈出,我將關閉此功能。

+0

我現在使用的Nokogiri版本(v1.6.5)絕對支持規範化。我像這樣使用它:'Nokogiri :: XML(xml_string){| config | config.strict} .canonicalize' – Epigene 2015-02-26 10:39:38

0

可能有點晚,並不是很理想,但this fork使用XMLStarlet通過命令行進行規範化。

0

的xmlcanonicalizer寶石似乎是目前最先進的日期紅寶石canonicaliser:

https://github.com/andrewferk/xmlcanonicalizer

它確實有一個bug然而,這使得它在無用一些canonicalising XML樹。某種人已經提交了一個補丁,但尚未應用於:

https://github.com/andrewferk/xmlcanonicalizer/pull/1

這個補丁的寶石加上紅寶石SAML的伎倆(加上更多,如果你想實現SAML SSO:

https://github.com/onelogin/ruby-saml

希望幫助別人節省3天我浪費了試圖讓事情工作了!:)

0

曾與xmlcanonicalizer問題。

xmlstarlet工作對我來說:

`echo "#{xml_str}" | xmlstarlet c14n`