Ruby中的XML数字签名

3
xml = '<?xml version="1.0" encoding="UTF-8"?>
    <User>
      <Uer id="user_id">
          <Code>1111</Code>
          <ID>0000000111</ID>
      </Uer>
      <Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
        <SignedInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
          <CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
          <SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
          <Reference Type="http://www.w3.org/2000/09/xmldsig#Object" URI="#user_id">
            <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
            <DigestValue>mwsSKYG+Q/krE54kcNpEGtXnQ+w=</DigestValue>
          </Reference>
        </SignedInfo>
        <SignatureValue>???????????????????</SignatureValue>
        <KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
          <X509Data>
            .........
          </X509Data>
        </KeyInfo>
      </Signature>
    </User>'

@xml = Nokogiri::XML.parse(xml)

我有一个xml文件,需要进行xml签名。像这样的<DigestValue>

Base64.encode64(OpenSSL::Digest::SHA1.digest(@xml.search("[id=#{user_id}]").to_html)).chop

结果很好。

当我计算<SignatureValue>值时,遇到了麻烦,就像这样

p = OpenSSL::PKCS12.new(File.read("/Path/signCert.p12"),"123456")
Base64.encode64(OpenSSL::PKey::RSA.new(p.key).sign(OpenSSL::Digest::SHA1.new, tmpxml.search("SignedInfo").to_html))

这个值是错误的。

2个回答

1

计算XML签名的签名值比简单地签署HTML内容要复杂得多。例如,你必须确保应用规范化等操作。详细信息可在 W3C spec 中找到。

目前我不知道Ruby中是否有适合进行XML签名创建和验证的工具,可能您的最佳选择是自己动手基于Nokogiri(实现规范时请做好痛苦的准备),或者切换到JRuby,并从那里集成默认提供的Java库


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接