9

我需要使用 ruby​​ 对 xml 进行签名,有人知道任何方法或库吗?

我的 xml 骨架是:

<?xml version="1.0" encoding="ISO-8859-1"?>
<Message>
    <MessageId> 
        <ServiceId>service</ServiceId> 
        <Version>1.0</Version> 
        <MsgDesc>Service Description</MsgDesc> 
        <Code>4</Code> 
        <FromAddress>from</FromAddress> 
        <ToAddress>to</ToAddress> 
        <Date>2012-10-29</Date> 
    </MessageId> 
    <MessageBody/> 

<Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
  <SignedInfo>
    <CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
    <SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
    <Reference URI="">
    <Transforms>
      <Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
    </Transforms>
    <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
    <DigestValue>??????</DigestValue>
    </Reference>
  </SignedInfo>

  <SignatureValue>????????????</SignatureValue>
  <KeyInfo>
    <X509Data>
      <X509Certificate>????????</X509Certificate>
    </X509Data>
  </KeyInfo>
</Signature>
</message>

我为 DigestValue 尝试了这段代码,并对其进行了测试,并将其与我的 java 示例进行了比较,但 DigestValue 与我的 java 示例的响应不匹配:

require 'base64'
require 'openssl'

to_sign_xml = File.read 'service.xml'
digest = OpenSSL::Digest::SHA1.digest(to_sign_xml)

digest = Base64.encode64(digest.to_s).gsub(/\n/, '')
raise digest.inspect

我的文件 service.xml 包含:

<Message>
    <MessageId> 
        <ServiceId>service</ServiceId> 
        <Version>1.0</Version> 
        <MsgDesc>Service Description</MsgDesc> 
        <Code>4</Code> 
        <FromAddress>from</FromAddress> 
        <ToAddress>to</ToAddress> 
        <Date>2012-10-29</Date> 
    </MessageId> 
    <MessageBody/>
<Message>
4

3 回答 3

8

如果你仍然感兴趣,我一周前制作了这个宝石。它仍在开发中,但基本的东西已经实现。此 gem 针对使用 xmlsec 库创建的签名进行测试。 http://www.aleksey.com/xmlsec/

我目前正在积极使用这个 gem,所以应该相对快速地修复错误。

https://rubygems.org/gems/xmldsig

于 2013-01-23T13:12:59.657 回答
2

不幸的是,XML 签名的创建和验证非常复杂。详细信息可以在规范中找到。前段时间我开始实现它以作为 stdlib 的补充,但后来因为另一个项目变得更加重要而停止,并且 Nokogiri 开始提供我需要的规范化功能,不幸的是已经直接使用 libxml 实现了。您可能想看看那里需要什么,然后将这些想法移植到普通的 Nokogiri 代码中。

使用这些,应该可以在 Ruby 中完全实现 XML-DSIG。但是要做好准备,这不是一件容易的事,很多很多小细节很有可能让你发疯......

切换到 JRuby 并集成Java 标准库附带的 XML-DSIG的默认实现可能会更好。

于 2012-11-17T14:59:06.260 回答
1

这是一个可用于签名/摘要的 gem,但是我在规范化方面仍然存在一些问题,可能这就是为什么我没有得到正确的摘要:https ://github.com/ebeigarts/signer

于 2013-11-08T13:38:34.683 回答