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

結果はOKです。

値を計算すると、<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))

そして、この値は間違っています。

4

2 に答える 2

1

残念ながら、XML 署名の署名値を計算することは、単に HTML コンテンツに署名するよりもはるかに複雑です。たとえば、必ず正規化を適用する必要があります。詳細については、W3C 仕様を参照してください。

適切な XML 署名の作成と検証を可能にするものが Ruby で利用可能になっていることを今のところ知りません。最善の選択肢は、おそらく Nokogiri に基づいて独自のものを作成することです (仕様) または JRuby に切り替えて、そこからデフォルトで利用可能なJava ライブラリを統合します。

于 2012-11-17T14:45:28.510 に答える
0

xmldsig gem もあります: https://rubygems.org/gems/xmldsig

于 2013-06-14T11:28:29.960 に答える