2010-06-14 14 views
10

Sto lavorando su un gateway SAML utilizzando Ruby/Rails e sto tentando di scrivere del codice che convalida lo xml digital signature della risposta SAML in arrivo rispetto al certificato x509 del servizio di origine.Canonicalizing XML in Ruby

Il mio problema: la firma dipende da una versione canonica dell'XML che viene sottoposta a hash e quindi firmata e sto riscontrando problemi nel trovare una lib/gem ruby ​​che canonicalizzi XML per the spec. Ho trovato uno super old gem on rubyforge che è un disastro ma sarei più interessato se qualcosa come nokogiri supportava questo tipo di funzionalità (dai documenti di nokogiri, non lo fa).

Ho cercato su Google ampiamente, ma ho pensato di chiedere da queste parti per vedere se qualcuno ha delle buone intuizioni prima di andare e provare a scrivere la mia versione o rielaborare la libreria c14n-r esistente.

+0

C'è un [XMLDSIG] (https://github.com/benoist/xmldsig) gemma di verificare e firmare documenti XML. – Chloe

risposta

5

dare a queste due gemme un colpo:

http://rubygems.org/gems/coupa-libxml-ruby

http://rubygems.org/gems/xmlsec-ruby

li ho scritto per un progetto SAML. La prima patch libxml-ruby aggiunge un binding per la funzione canonicalize nella libreria di base C.

Quest'ultimo è un ruby ​​binding per xmlsec. In questo momento tutto ciò che funziona è la verifica delle firme, che era tutto ciò di cui avevo bisogno per il progetto, ma sembra che sia adatto anche alle tue esigenze.

Suggerirei di andare con xmlsec perché provare a scrivere il proprio codice di verifica della firma XML è un esercizio inutile. Aspetta che tu abbia a che fare con firme con più buste, certificati incorporati, gah. Lascia che xmlsec gestisca quella merda.

+0

Grazie per il tip man; Darò una prova alla versione xmlsec. Sfortunatamente, nokogiri ha ritardato il supporto di c14n fino alla versione 1.4.4 ma è stato rilasciato di recente e non lo vedo nemmeno lì. Potrebbe essere stato spostato di nuovo a 1.5. Nel frattempo darò una prova! – whazzmaster

+1

Solo per la cronaca, Nokogiri ora supporta il canonicalize: http://nokogiri.org/Nokogiri/XML/Document.html#method-i-canonizeize – jBilbo

+0

libxml-ruby ha anche integrato il metodo canonicalize. http://xml4r.github.io/libxml-ruby/rdoc/classes/LibXML/XML/Document.html#method-i-canonicalize – Chloe

0

Ho un rubino/rotaie Service Provider e .NET (ComponentSoft) IDP

questo ha funzionato per me (ho avuto problemi con la versione Canonicalized del XML):

received_certificate = XPath.first(response_document,"//samlp:Response//Signature//KeyInfo//X509Data//X509Certificate").text 

def self.verify_signature(received_certificate, idp_certificate_path) 
    certificate ||= OpenSSL::X509::Certificate.new(File.read(idp_certificate_path)) 
    cert_decoded = Base64.decode64(received_certificate) 
    cert = OpenSSL::X509::Certificate.new(cert_decoded) 
    certificate.verify(cert.public_key) 
end 
+0

Immagino che questo non fosse un tuo problema ... – Mada

+1

True. Devo convalidare il contenuto firmato contro il contenuto digerito usando il certificato X509. Il codice sopra convaliderà che il certificato X509 corrisponde a ciò che dice, ma a meno che tu non verifichi il allora non sai se il messaggio è originato da quel certificato. – whazzmaster

+0

Ho trovato pochi collegamenti che potrebbero aiutare: http://github.com/onelogin/ruby-saml/blob/master/lib/xml_sec.rb http://rubygems.org/gems/XMLCanonicalizer http: // rubygems.org/gems/saml2ruby – Mada

1

Dopo guardandomi in giro ho scoperto che nokogiri ha messo il supporto per c14n nella lista delle cose da fare per il next release. Non so più di questo, ma sembra che nessuna libreria XML ampiamente utilizzata supporti il ​​c14n a partire da giugno 2010. Chiuderò questo perché non è emerso nulla.

+0

La versione Nokogiri che sto usando ora (v1.6.5) supporta decisamente la canonicalizzazione. Lo uso in questo modo: 'Nokogiri :: XML (xml_string) {| config | config.strict} .canonicalize' – Epigene

0

Probabilmente un po 'in ritardo e non proprio ideale, ma this fork utilizza XMLStarlet tramite riga di comando per canonicalizzazione.

0

Il xmlcanonicalizer gemma sembra essere il più rubino canonicaliser up-to-data disponibile:

https://github.com/andrewferk/xmlcanonicalizer

Essa ha un bug però, che lo rende inutile a canonicalising alcuni alberi XML.Qualche persona gentile ha presentato una patch, ma non è stato ancora applicato:

https://github.com/andrewferk/xmlcanonicalizer/pull/1

Questo gioiello patch più rubino SAML fa il trucco (e molto di più, se si sta cercando di attuare SAML SSO:

https://github.com/onelogin/ruby-saml

Speranza che aiuta qualcuno a salvare i 3 giorni ho sprecato cercando di far funzionare le cose! :)

0

ha avuto problemi con xmlcanonicalizer.

xmlstarlet ha funzionato per me:

`echo "#{xml_str}" | xmlstarlet c14n`