2012-11-12 5 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 서명이 필요하다. <DigestValue> like this루비의 XML 디지털 서명

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

결과가 양호합니다.

나는이

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

처럼, 내가 문제를 얻을 <SignatureValue> 값을 계산하면이 값이 잘못되었습니다. XML 서명의 서명 값을 계산

답변

1

단순히 불행하게도, HTML 내용에 서명보다 훨씬 더 복잡하다. 예를 들어 정규화를 적용해야합니다. 자세한 내용은 W3C spec에서 확인할 수 있습니다.

Ruby에서 적절한 XML 서명 작성 및 검증을 수행 할 수있는 무언가를 알지 못합니다. 귀하의 최선의 선택은 아마도 Nokogiri를 기반으로 자신 만의 방법을 선택하는 것입니다. spec을 구현하는 고통) 또는 JRuby로 전환하고 거기에서부터 기본적으로 사용 가능한 Java library을 통합하십시오.