2012-11-12 53 views
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>這樣的Ruby中的XML數字簽名

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

並且結果是OK。

當我計算​​3210值我得到的麻煩,這樣

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)) 

,該值是錯誤的。

回答

1

不幸的是,計算XML簽名的簽名值比簡單地簽署HTML內容要複雜得多。例如,您必須確保應用Canonicalization。血淋淋的細節可以在W3C spec找到。

我不知道Ruby中現在有什麼東西可以讓你做適當的XML簽名創建和驗證,你最好的選擇可能是要根據Nokogiri來鞭策你自己(爲世界做好準備的痛苦實施規範)或切換到JRuby,並從那裏,整合默認可用的Java library