Канонизация XML в Ruby - PullRequest
10 голосов
/ 14 июня 2010

Я работаю на шлюзе SAML с использованием Ruby / Rails и пытаюсь написать код, который проверяет xml цифровую подпись входящего ответа SAML по сертификату x509 исходной службы.

Моя проблема: подпись зависит от канонизированной версии XML, который хэшируется и затем подписывается, и у меня возникают проблемы с поиском ruby ​​lib / gem, который канонизирует XML для спецификации ,Я нашел супер старый драгоценный камень на rubyforge , который беспорядок, но мне было бы больше интересно, если бы что-то вроде nokogiri поддерживало такую ​​функцию (из документации по nokogiri, нет).

Я много гуглил, но решил спросить здесь, чтобы узнать, есть ли у кого-нибудь хорошие идеи, прежде чем я пойду и попытаюсь написать свою собственную версию или переделать существующую библиотеку c14n-r.

Ответы [ 6 ]

5 голосов
/ 15 декабря 2010

Дайте этим двум драгоценным камням шанс:

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

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

Я написал их для проекта SAML. Первый исправляет libxml-ruby, чтобы добавить привязку для функции канонизации в базовой библиотеке C.

Последний является привязкой ruby ​​для xmlsec. Прямо сейчас все, что работает, - это проверка подписи, и это все, что мне было нужно для проекта, но, похоже, она тоже подойдет вам.

Я бы порекомендовал перейти на xmlsec, потому что попытка написать собственный код проверки подписи XML - бесполезное занятие. Просто подождите, пока вам не придется иметь дело с несколькими конвертами с подписью, встроенными сертификатами. Пусть xmlsec справится с этим дерьмом.

1 голос
/ 16 июня 2010

Посмотрев еще немного, я обнаружил, что nokogiri включил поддержку c14n в список задач для следующего выпуска . Не знаю больше - но похоже, что ни одна широко используемая библиотека XML не поддерживает c14n по состоянию на июнь 2010 года. Я закрою это, так как на самом деле ничего не появилось.

0 голосов
/ 30 июня 2011

были проблемы с xmlcanonicalizer.

xmlstarlet работал для меня:

`echo "#{xml_str}" | xmlstarlet c14n`
0 голосов
/ 13 июня 2011

Похоже, что гем xmlcanonicalizer является самой современной из доступных рубиновых канонизаторов:

https://github.com/andrewferk/xmlcanonicalizer

Однако в нем есть ошибка, которая делает его бесполезным при канонизации некоторого XMLдеревья.Какой-то добрый человек прислал патч, но он еще не был применен:

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

Этот исправленный камень плюс ruby-saml делает свое дело (плюс еще, если вы пытаетесьдля реализации SAML SSO:

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

Надеюсь, что это поможет кому-то сэкономить 3 дня, которые я потратил впустую, пытаясь заставить вещи работать!:)

0 голосов
/ 27 апреля 2011

Возможно, немного поздно и не совсем идеально, но этот форк использует XMLStarlet через командную строку для канонизации.

0 голосов
/ 15 июня 2010

У меня есть поставщик услуг ruby ​​/ rails и IDP .NET (ComponentSoft)

это сработало для меня (у меня не было проблем с канонизированной версией 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
...