10

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

我的问题:签名取决于经过散列然后签名的 XML 的规范化版本,我无法找到一个 ruby​​ lib/gem,它将按照规范规范化XML。我在 ruby​​forge 上发现了一个超级旧的宝石,它很乱,但如果像 nokogiri 这样的东西支持这种功能,我会更感兴趣(来自 nokogiri 文档,它不支持)。

我已经在谷歌上进行了广泛的搜索,但我想在我去尝试编写自己的版本或重新编写现有的 c14n-r 库之前,我会在这里询问是否有人有任何好的见解。

4

6 回答 6

5

试一试这两个宝石:

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

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

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

后者是 xmlsec 的 ruby​​ 绑定。现在所有工作都是签名验证,这是我项目所需要的,但听起来它也符合您的需求。

我建议使用 xmlsec,因为尝试编写自己的 XML 签名验证代码是徒劳的。等到你必须处理多个封装的签名、嵌入式证书等等。让 xmlsec 处理这些废话。

于 2010-12-15T01:25:12.150 回答
1

在环顾四周后,我发现 nokogiri 已将 c14n 支持放在下一个版本的待办事项列表中。不知道更多——但截至 2010 年 6 月,似乎没有广泛使用的 XML 库支持 c14n。我将关闭它,因为没有真正弹出。

于 2010-06-16T16:01:37.297 回答
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
于 2010-06-15T15:52:18.743 回答
0

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

于 2011-04-27T19:04:55.040 回答
0

xmlcanonicalizer gem 似乎是最新的 ruby​​ 规范化器:

https://github.com/andrewferk/xmlcanonicalizer

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

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

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

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

希望这可以帮助某人节省我浪费在试图让事情正常工作的 3 天!:)

于 2011-06-13T02:09:51.273 回答
0

xmlcanonicalizer 有问题。

xmlstarlet 为我工作:

`echo "#{xml_str}" | xmlstarlet c14n`
于 2011-06-30T09:19:23.443 回答