Канонизация XML в Ruby

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

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

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


person whazzmaster    schedule 14.06.2010    source источник
comment
Существует гем xmldsig для проверки и подписи XML-документов.   -  person Chloe    schedule 30.07.2013


Ответы (6)


Попробуйте эти две жемчужины:

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

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

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

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

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

person coding抠腚    schedule 15.12.2010
comment
Спасибо за подсказку; Я попробую xmlsec lib. К сожалению, nokogiri отложил поддержку c14n до версии 1.4.4, но она была выпущена недавно, и я не вижу ее там. Возможно, его снова отодвинули до 1,5. А пока попробую! - person whazzmaster; 15.12.2010
comment
Для протокола: Nokogiri теперь поддерживает канонизацию: nokogiri.org/ Nokogiri/XML/Document.html#method-i-canonicalize - person jBilbo; 09.07.2012
comment
libxml-ruby также интегрировал метод канонизации. xml4r.github.io/ libxml-ruby/rdoc/classes/LibXML/XML/ - person Chloe; 09.05.2013

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

person whazzmaster    schedule 16.06.2010
comment
Версия Nokogiri, которую я использую сейчас (v1.6.5), определенно поддерживает канонизацию. Я использую это так: Nokogiri::XML(xml_string) { |config| config.strict }.canonicalize - person Epigene; 26.02.2015

У меня есть поставщик услуг 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
person Mada    schedule 15.06.2010
comment
Верно: мне нужно проверить подписанное содержимое ‹SignatureValue› на соответствие обработанному содержимому ‹SignedInfo› с помощью сертификата X509. Приведенный выше код подтвердит, что сертификат X509 соответствует тому, что он делает, но если вы не проверите ‹SignatureValue›, вы не узнаете, исходит ли сообщение из этого сертификата. - person whazzmaster; 16.06.2010
comment
Я нашел несколько ссылок, которые могут помочь: github.com/onelogin/ ruby-saml/blob/master/lib/xml_sec.rb rubygems.org/gems/XMLCanonicalizer rubygems.org/gems/saml2ruby - person Mada; 17.06.2010

Гем 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 дня, которые я потратил впустую, пытаясь заставить все работать! :)

person Brendon Muir    schedule 13.06.2011

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

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

`echo "#{xml_str}" | xmlstarlet c14n`
person franee    schedule 30.06.2011

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

person Chris Kimpton    schedule 27.04.2011