2010-06-14 12 views
10

Je travaille sur une passerelle SAML en utilisant Ruby/Rails et j'essaye d'écrire du code qui valide le xml digital signature de la réponse SAML entrante par rapport au certificat x509 du service d'origine. Mon problème: la signature dépend d'une version canonisée du code XML qui est hachée puis signée et j'ai du mal à trouver une lib/gem ruby ​​qui va canoniser XML pour the spec. J'ai trouvé un super old gem on rubyforge qui est un désordre mais je serais plus intéressé si quelque chose comme nokogiri supportait ce genre de fonctionnalité (à partir des docs de nokogiri, ce n'est pas le cas). J'ai fait de nombreuses recherches sur google, mais j'ai pensé que je demanderais par ici pour voir si quelqu'un a de bonnes idées avant de partir et d'essayer d'écrire ma propre version ou de retravailler la bibliothèque c14n-r existante.Canonicalisation XML dans Ruby

+0

Il y a un [xmldsig] (https://github.com/benoist/xmldsig) gem pour vérifier et signer des documents XML. – Chloe

Répondre

5

Donnez ces deux pierres précieuses un coup:

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

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

Je leur ai écrit pour un projet SAML. Les premiers correctifs libxml-ruby ajoutent une liaison pour la fonction canonicalize dans la bibliothèque C de base.

Ce dernier est une liaison ruby ​​pour xmlsec. À l'heure actuelle, tout ce qui fonctionne est la vérification de signature, ce qui était tout ce dont j'avais besoin pour le projet, mais il semble que cela correspondrait à vos besoins aussi.

Je recommanderais d'aller avec xmlsec car essayer d'écrire son propre code de vérification de signature XML est un exercice futile. Attendez que vous ayez à traiter plusieurs signatures enveloppées, certificats intégrés, gah. Laissez xmlsec gérer cette merde.

+0

Merci pour l'homme de pointe; Je vais essayer la librairie xmlsec. Malheureusement, nokogiri a retardé le support de c14n jusqu'à la version 1.4.4, mais cela a été publié récemment et je ne le vois pas non plus. Il a peut-être été repoussé à 1.5. En attendant, je vais essayer! – whazzmaster

+1

Juste pour le compte rendu, Nokogiri a maintenant le support de canonicalize: http://nokogiri.org/Nokogiri/XML/Document.html#method-i-canonicalize – jBilbo

+0

libxml-ruby a également intégré la méthode canonicalize. http://xml4r.github.io/libxml-ruby/rdoc/classes/LibXML/XML/Document.html#method-i-canonicalize – Chloe

0

J'ai un rubis/rails fournisseur de services et un .NET (ComponentSoft) IDP

cela a fonctionné pour moi (j'eu aucun problème avec la version canonisé du 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

Je suppose que ce n'était pas votre problème ... – Mada

+1

True-- J'ai besoin de valider le contenu signé par rapport au contenu digéré en utilisant le certificat X509. Le code ci-dessus va valider que le cert X509 correspond à ce qu'il dit, mais à moins que vous ne vérifiiez le alors vous ne savez pas si le message provient de ce cert. – whazzmaster

+0

J'ai trouvé quelques liens qui pourraient aider: http://github.com/onelogin/ruby-saml/blob/master/lib/xml_sec.rb http://rubygems.org/gems/XMLCanonicalizer http: // rubygems.org/gems/saml2ruby – Mada

1

Après en regardant autour de plus, j'ai trouvé que nokogiri a mis le support c14n sur la liste todo pour le next release. Je ne sais pas plus que ça, mais il semble qu'aucune bibliothèque XML largement utilisée ne supporte c14n à partir de juin 2010. Je vais fermer ça car rien ne s'est vraiment passé.

+0

La version de Nokogiri que j'utilise maintenant (v1.6.5) supporte définitivement la canonisation. Je l'utilise comme ça: 'Nokogiri :: XML (xml_string) {| config | config.strict} .canonicalize' – Epigene

0

Probablement un peu en retard et pas vraiment idéal, mais this fork utilise XMLStarlet via une ligne de commande pour la canonisation.

0

Le gem xmlcanonicalizer semble être le plus à jour canonicaliser rubis disponible:

https://github.com/andrewferk/xmlcanonicalizer

Il a un bug cependant, qui le rend inutile à canonicalising quelques arbres XML.Une personne a présenté un type patch, mais il n'a pas été encore appliquée:

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

Ce petit bijou patché plus de rubis SAML le tour est joué (et plus encore, si vous essayez de mettre en œuvre SAML SSO:

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

espoir qui aide quelqu'un à sauver les 3 jours que j'ai perdu en essayant de faire avancer les choses à travailler! :)

0

a eu des problèmes avec xmlcanonicalizer.

xmlstarlet a fonctionné pour moi:

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