2010-06-14 22 views
10

Estoy trabajando en una puerta de enlace SAML usando Ruby/Rails y estoy intentando escribir algún código que valida el xml digital signature de la respuesta SAML entrante contra el certificado x509 del servicio de origen.Canonicalizing XML en Ruby

Mi problema: la firma depende de una versión canonicalizada del XML que es hash y luego firmado y tengo problemas para encontrar una lib/ruby ​​lib que canonicalize XML por the spec. Encontré un super old gem on rubyforge que es un desastre, pero estaría más interesado si algo como nokogiri admite este tipo de funcionalidad (de los documentos de nokogiri, no es así).

He buscado en Google extensamente pero pensé en preguntar aquí para ver si alguien tiene alguna buena idea antes de ir y tratar de escribir mi propia versión o volver a trabajar con la biblioteca c14n-r existente.

+0

No es una joya [XMLDSig] (https://github.com/benoist/xmldsig) para verificar y firmar documentos XML. – Chloe

Respuesta

5

dar a estas dos gemas un tiro:

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

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

las escribí para un proyecto de SAML. La primera parchea libxml-ruby para agregar un enlace para la función canonicalize en la biblioteca base C.

Este último es ruby ​​vinculante para xmlsec. En este momento, todo lo que funciona es la verificación de firmas, que era todo lo que necesitaba para el proyecto, pero parece que también se ajustaría a sus necesidades.

Recomiendo ir con xmlsec porque tratar de escribir su propio código de verificación de firma XML es un ejercicio inútil. Solo espera hasta que tengas que lidiar con múltiples firmas envolventes, certificados incrustados, gah. Deje que xmlsec maneje esa mierda.

+0

Gracias por el consejo; Le daré una oportunidad a la lib xmlsec. Desafortunadamente, nokogiri retrasó el soporte de c14n hasta el lanzamiento de la versión 1.4.4, pero fue lanzado recientemente y tampoco lo veo allí. Puede haberse retrocedido nuevamente a 1.5. ¡Mientras tanto, intentaré esto! – whazzmaster

+1

Solo para el registro, Nokogiri ahora tiene soporte para canonicalizar: http://nokogiri.org/Nokogiri/XML/Document.html#method-i-canonicalize – jBilbo

+0

libxml-ruby también integró el método canonicalize. http://xml4r.github.io/libxml-ruby/rdoc/classes/LibXML/XML/Document.html#method-i-canonicalize – Chloe

0

tengo un rubí/rieles de proveedor de servicios y una .NET (ComponentSoft) IDP

esto funcionó para mí (no tuve problemas con la versión canónica 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

Supongo que este no era su problema ... – Mada

+1

Cierto ... Necesito validar el contenido firmado contra el contenido digerido utilizando el certificado X509. El código anterior validará que el certificado X509 coincida con lo que dice que hace, pero a menos que usted verifique , entonces no sabe si el mensaje se originó a partir de ese certificado. – whazzmaster

+0

Encontré algunos enlaces que podrían ayudar: http://github.com/onelogin/ruby-saml/blob/master/lib/xml_sec.rb http://rubygems.org/gems/XMLCanonicalizer http: // rubygems.org/gems/saml2ruby – Mada

1

Después mirando un poco más he encontrado que nokogiri ha puesto compatibilidad con c14n en la lista de tareas para el next release. No sé más que eso, pero parece que ninguna biblioteca XML ampliamente utilizada admite c14n a partir de junio de 2010. Cerraré esto ya que no apareció nada.

+0

La versión de Nokogiri que estoy usando ahora (v1.6.5) definitivamente admite canonicalización. Lo uso así: 'Nokogiri :: XML (xml_string) {| config | config.strict} .canonicalize' – Epigene

0

Probablemente un poco tarde y no es realmente ideal, pero this fork utiliza XMLStarlet a través de la línea de comandos para la canonicalización.

0

El xmlcanonicalizer joya parece ser el más canonicaliser hasta a la fecha de rubí disponibles:

https://github.com/andrewferk/xmlcanonicalizer

Se tiene un error sin embargo, que hace que sea inútil en canonicalising algunos árboles XML.Algunos persona amable ha presentado un parche pero no se ha aplicado aún:

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

Esta joya parcheado además rubí saml hace el truco (y más, si usted está tratando de implementar SAML SSO:

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

la esperanza de que ayude a alguien a salvar los 3 días que pierde tiempo tratando de conseguir cosas para trabajar! :)

0

tenían problemas con xmlcanonicalizer.

xmlstarlet trabajó para mí:

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