Я работаю над шлюзом SAML с помощью Ruby/направляющих, и я пытаюсь написать некоторый код, который проверяет цифровую подпись XML входящего ответа SAML против x509 сертификата инициирующего сервиса.
Моя проблема: подпись зависит от канонизированной версии XML, который хешируется и затем подписывается, и я испытываю затруднения при нахождении рубинового lib/драгоценного камня, который канонизирует XML на спецификацию. Я нашел супер старый драгоценный камень на rubyforge, который является путаницей, но мне больше было бы интересно, если бы что-то как nokogiri поддерживало этот вид функциональности (из nokogiri документов, это не делает).
Я погуглил экстенсивно, но думал, что попросил бы здесь видеть, есть ли у кого-либо какое-либо хорошее понимание, прежде чем я пойду и попытаюсь записать свою собственную версию или переделать существующую c14n-r библиотеку.
У меня есть поставщик услуг 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
Осмотревшись вокруг еще немного, я обнаружил, что nokogiri включил поддержку c14n в список todo для следующего релиза. Больше я ничего не знаю, но похоже, что ни одна широко используемая XML-библиотека не поддерживает c14n по состоянию на июнь 2010 года. Я закрою эту тему, поскольку ничего особенного не всплыло.