在Ruby中规范化XML

时间:2010-06-14 16:04:39

标签: ruby xml digital-signature saml

我正在使用Ruby / Rails开发SAML网关,我正在尝试编写一些代码,根据原始服务的x509证书验证传入SAML响应的xml digital signature

我的问题:签名取决于经过哈希处理然后签名的XML的规范化版本,我无法找到一个ruby lib / gem,它将按照the spec规范化XML。我发现super old gem on rubyforge是一团糟,但是如果像nokogiri这样的东西支持这种功能我会更感兴趣(来自nokogiri文档,它没有)。

我已广泛搜索过,但我想在此之前询问是否有人有任何好的见解,然后再尝试编写自己的版本或重新编写现有的c14n-r库。

6 个答案:

答案 0 :(得分: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处理那个垃圾。

答案 1 :(得分:1)

在环顾四周之后,我发现nokogiri已经为next release的待办事项列表提供了c14n支持。不知道更多 - 但似乎截至2010年6月没有广泛使用的XML库支持c14n。我会关闭它,因为没有真正弹出。

答案 2 :(得分: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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

xmlcanonicalizer gem似乎是最新的ruby canonicaliser:

https://github.com/andrewferk/xmlcanonicalizer

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

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

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

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

希望能帮助别人节省3天我浪费的时间让事情发挥作用! :)

答案 5 :(得分:0)

xmlcanonicalizer有问题。

xmlstarlet为我工作:

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