2012-10-29 5 views
9

Ich muss Xml mit Ruby signieren, kennt jemand irgendeine Methode oder Lib dafür?Wie man XML-Signaturen in Ruby macht

Mein xml Skelett ist:

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

ich diesen Code für Digest versucht, und ich habe es getestet, es mit meinem Java-Beispiel zu vergleichen, aber Digest nicht mit der Reaktion meines java Beispiel passend:

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 

Meine Datei service.xml enthalten, dass:

<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

Sie gesehen nicht nehmen Kanonisierung, vgl. http://www.w3.org/TR/xml-exc-c14n/ in Ihrem Fall. – mkl

+3

Ich entschuldige mich im Voraus für die Welt der Schmerzen, die Sie eingeben werden =) Siehe diese verwandte Frage: http://stackoverflow.com/questions/3038757/canonicalizing-xml-in-ruby – maerics

Antwort

6

Wenn Sie noch interessiert sind, habe ich dieses Juwel vor einer Woche gemacht. Es ist noch in der Entwicklung, aber die grundlegenden Dinge sind implementiert. Dieses Juwel wird anhand von Signaturen getestet, die mit der Bibliothek xmlsec erstellt wurden. http://www.aleksey.com/xmlsec/

Ich arbeite aktiv mit diesem Juwel im Moment, so Bugs sollte relativ schnell behoben werden.

https://rubygems.org/gems/xmldsig

2

Leider XML s Ignature Erstellung und Verifikation ist sehr kompliziert. Details finden Sie in der spec. Ich fing an, es als Ergänzung zu stdlib some time ago zu implementieren, aber dann gestoppt, weil ein anderes Projekt wichtiger wurde und Nokogiri begann, die Canonicalization Features zu bieten, die ich brauchte und hatte leider bereits mit libxml direkt implementiert. Vielleicht möchten Sie dort nachsehen, was benötigt wird, und dann die Ideen in einfachen Nokogiri-Code portieren.

Mit diesen sollte es möglich sein, XML-DSIG in Ruby vollständig zu implementieren. Aber seien Sie darauf vorbereitet, es ist keine einfache Sache zu tun, viele und viele kleine Details, die großes Potenzial haben, Sie verrückt zu machen ...

Sie könnten besser dran sein, indem Sie auf JRuby und durch die Integration der default implementation von XML -DSIG, das mit den Java-Standardbibliotheken geliefert wird.

1

Dies ist ein brauchbares Juwel für die Signierung/Verdauen, aber immer noch ich ein Problem mit der Kanonisierung und das ist wahrscheinlich, warum ich nicht die richtigen Digests erhalten: https://github.com/ebeigarts/signer