2012-10-29 11 views
9

Potrzebuję podpisać xml za pomocą ruby, ktoś zna jakąkolwiek metodę lub lib do tego?Jak zrobić podpisywanie xml w Ruby

Moje xml szkielet jest:

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

Próbowałem ten kod DigestValue i ja testowałem go, porównując ją z moim przykładzie java, ale DigestValue nie jest zgodne z odpowiedzią na moim przykładzie 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 

Mój plik service.xml zawierać że:

<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

Nie widziałem, aby wziąć z uwzględnieniem kanonizacji, zob. http://www.w3.org/TR/xml-exc-c14n/ w twoim przypadku. – mkl

+3

Przepraszam z góry za świat bólu, który zamierzasz wprowadzić =) Zobacz to powiązane pytanie: http://stackoverflow.com/questions/3038757/canonicalizing-xml-in-ruby – maerics

Odpowiedz

6

Jeśli nadal jesteś zainteresowany, zrobiłem ten klejnot tydzień temu. Nadal jest w fazie rozwoju, ale podstawowe rzeczy są zaimplementowane. Ten klejnot jest testowany na podstawie sygnatur utworzonych za pomocą biblioteki xmlsec. http://www.aleksey.com/xmlsec/

Aktywnie pracuję z tym klejnotem, więc błędy powinny być naprawione stosunkowo szybko.

https://rubygems.org/gems/xmldsig

2

Niestety, XML s tworzenie i weryfikacja ognia jest bardzo skomplikowana. Szczegóły można znaleźć w spec. Zacząłem go wdrażać, aby zaproponować jako dodatek do stdlib some time ago, ale potem przestałem, ponieważ inny projekt stał się ważniejszy i Nokogiri zaczął oferować funkcje kanoniczne, których potrzebowałem i które niestety już wdrożyły bezpośrednio przy użyciu libxml. Możesz tam zajrzeć, aby zobaczyć, co jest potrzebne, a następnie przenieść pomysły do ​​zwykłego kodu Nokogiri.

Korzystanie z nich powinno być możliwe do pełnego wdrożenia XML-DSIG w Ruby. Ale przygotuj się, to nie jest łatwe, wiele małych detali, które mają wielki potencjał, by cię podniecić ...

Możesz być lepszy, przechodząc na JRuby i integrując kod XML default implementation -DSIG, który jest dostarczany ze standardowymi bibliotekami Java.