如何在ruby中进行xml签名

时间:2012-10-29 17:47:27

标签: ruby xml digital-signature digest

我需要使用ruby签名xml,有人知道任何方法或lib吗?

我的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>

3 个答案:

答案 0 :(得分:7)

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

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

https://rubygems.org/gems/xmldsig

答案 1 :(得分:2)

不幸的是,XML签名的创建和验证非常复杂。详细信息可在spec中找到。我开始实现它作为stdlib some time ago的补充提议,但后来因为另一个项目变得更加重要而停止了,Nokogiri开始提供我需要的Canonicalization功能,遗憾的是已经直接使用libxml实现了。你可能想看看那里需要什么,然后把想法移植到普通的Nokogiri代码。

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

通过切换到JRuby,并通过集成Java标准库附带的default implementation XML-DSIG,可能会更好。

答案 2 :(得分:1)

这是一个可用于签名/摘要的宝石,但是我仍然存在规范化的问题,这可能就是我没有得到正确的摘要的原因:https://github.com/ebeigarts/signer