在Ruby中规范化XML

我正在使用Ruby / Rails开发SAML网关,并且我正在尝试编写一些代码来validation传入SAML响应的xml数字签名与原始服务的x509证书。

我的问题:签名依赖于经过哈希处理然后签名的XML的规范化版本,我无法找到一个ruby lib / gem,它将根据规范规范化XML。 我在rubyforge上发现了一个超级老gem,但是如果像nokogiri这样的function支持这种function我会更感兴趣(来自nokogiri docs,它没有)。

我已经广泛搜索过,但我想在这里问一下是否有人有任何好的见解,然后我去尝试编写我自己的版本或重做现有的c14n-r库。

给这两个gem一个镜头:

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

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

我为SAML项目编写了它们。 第一个修补程序libxml-ruby为基本C库中的canonicalize函数添加一个绑定。

后者是xmlsec的ruby绑定。 现在所有可行的都是签名validation,这是我项目所需的全部内容,但听起来它也符合您的需求。

我建议使用xmlsec,因为尝试编写自己的XML签名validation代码是徒劳的。 等到你必须处理多个封装签名,嵌入式证书,gah。 让xmlsec处理那个垃圾。

在查看了一些之后,我发现nokogiri已经为下一个版本的待办事项列表提供了c14n支持。 不知道更多 – 但似乎没有广泛使用的XML库支持截至2010年6月的c14n。我将关闭它,因为没有真正弹出。

我有一个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 

xmlcanonicalizer gem似乎是最新的ruby canonicaliser:

https://github.com/andrewferk/xmlcanonicalizer

但它确实有一个bug,这使得在规范化某些XML树时无用。 有些人提交了补丁但尚未应用:

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

这个修补的gem加ruby-saml可以解决这个问题(如果你正在尝试实现SAML SSO,还有更多:

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

希望能帮助别人节省3天我浪费了试图让事情发挥作用! 🙂

xmlcanonicalizer有问题。

xmlstarlet为我工作:

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

可能有点晚了,并不是很理想,但是这个fork通过命令行使用XMLStarlet进行规范化。