我正在使用Ruby / Rails开发SAML网关,我正在尝试编写一些代码,根据原始服务的x509证书验证传入SAML响应的xml digital signature。
我的问题:签名取决于经过哈希处理然后签名的XML的规范化版本,我无法找到一个ruby lib / gem,它将按照the spec规范化XML。我发现super old gem on rubyforge是一团糟,但是如果像nokogiri这样的东西支持这种功能我会更感兴趣(来自nokogiri文档,它没有)。
我已广泛搜索过,但我想在此之前询问是否有人有任何好的见解,然后再尝试编写自己的版本或重新编写现有的c14n-r库。
答案 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`