2012-10-29 11 views
9

Ho bisogno di firmare xml usando ruby, qualcuno conosce qualche metodo o lib per quello?Come fare la firma xml nel rubino

mio scheletro 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> 

Ho provato questo codice per DigestValue e ho provato, confrontandolo con il mio esempio java, ma DigestValue non corrisponde con la risposta di mio esempio 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 

mio service.xml di file contiene quanto segue:

<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> 
+2

Non visto di prendere in considerazione canonicalizzazione, cfr. http://www.w3.org/TR/xml-exc-c14n/ nel tuo caso. – mkl

+3

Mi scuso in anticipo per il mondo del dolore che stai per inserire =) Vedi questa domanda correlata: http://stackoverflow.com/questions/3038757/canonicalizing-xml-in-ruby – maerics

risposta

6

Se sei ancora interessato ho fatto questo gioiello una settimana fa. È ancora in sviluppo, ma le cose di base sono implementate. Questo gioiello è testato contro le firme create con la libreria xmlsec. http://www.aleksey.com/xmlsec/

Attualmente sto lavorando con questa gemma in questo momento, quindi i bug dovrebbero essere corretti relativamente velocemente.

https://rubygems.org/gems/xmldsig

2

Purtroppo, XML s la creazione e la verifica di ignature sono molto complicate. Dettagli possono essere trovati nel spec. Ho iniziato a implementarlo per proporre un'aggiunta a stdlib some time ago, ma poi mi sono interrotto perché un altro progetto è diventato più importante e Nokogiri ha iniziato a offrire le funzionalità di Canonicalizzazione che avevo bisogno e che purtroppo avevo già implementato usando libxml direttamente. Potresti voler dare un'occhiata lì per vedere cosa è necessario e quindi portare le idee sul semplice codice Nokogiri.

Utilizzando questi, dovrebbe essere possibile implementare completamente XML-DSIG in Ruby. Ma preparati, non è una cosa facile da fare, tanti piccoli dettagli che hanno un grande potenziale per farti impazzire ...

Potresti stare meglio passando a JRuby e integrando lo default implementation di XML -DSIG fornito con le librerie standard Java.

Problemi correlati