Проблемы с проверкой подписи с использованием OpenSAML и OpenSSO - PullRequest
5 голосов
/ 02 октября 2010

Мы используем OpenSAML на сайте поставщика услуг для обеспечения единого входа для наших клиентов. Наш клиент (провайдер идентификаторов) использует OpenSSO на своих концах. Ответ SAML, публикуемый OpenSSO, немного отличается в том, что касается элемента подписи, так как он не определен пространством имен. Похоже, что это не очень хорошо с OpenSAML и возвращает ноль из samlResponse.getSignature() метод, из-за которого я не могу проверить подпись.

Фрагмент подписи SamlReponse, который вызывает проблему

<Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
    <SignedInfo>
        <CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
        <SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" />
        <Reference URI="#s2d10cccbd58d1f78c2c76c74c82a236548c929ffd">
            <Transforms>
                <Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" />
                <Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
            </Transforms>
            <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
            <DigestValue>j+KBoDOtEcyCquPTxRCXoBulStQ=</DigestValue>
        </Reference>
    </SignedInfo>
    <SignatureValue>Dv+owuZfGFymGGrw2gHA3/7GVC6mXt8JMW+tOvmtnjTRJZaDE+Nb2NCngio1Tnqu4LWnvVrry4Wk... 6QcIJi/kGc4YFMSQj/Q=</SignatureValue>
    <KeyInfo>
        <X509Data>
            <X509Certificate>MIIEhDCCA+2gAwIBAgIQXxhipi2wpPxWi7MTVfFVHDANBgkqhkiG9w0BAQUFADCBujEfMB0GA1UE... 78Q/lRQuBhHMy02lKctnwjBeEYA=</X509Certificate>
        </X509Data>
    </KeyInfo>
</Signature>

Фрагмент подписи из другого ответа SAML, который работает

<dsig:Signature xmlns="http://www.w3.org/2000/09/xmldsig#" xmlns:dsig="http://www.w3.org/2000/09/xmldsig#">
    <dsig:SignedInfo>
        <dsig:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
        <dsig:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" />
        <dsig:Reference URI="#id-TtLltjcBSOAJ6OipumUEj8o0Qag-">
            <dsig:Transforms>
                <dsig:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" />
                <dsig:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
            </dsig:Transforms>
            <dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
            <dsig:DigestValue>5c95zhA139qzMvZA2A445F3LWaU=</dsig:DigestValue>
        </dsig:Reference>
    </dsig:SignedInfo>
    <dsig:SignatureValue>JsmRFJn1CjClHs4rf0hrwKzOq6ZtmnOEm/PNiaJvYurko/ZP+PApWhk55x0unIVwZ6XDv3k8Dj81WqUl07J0Dkvzp71bccIgiGTRzoNPT71nBAXxJmZiXz51JWctg13zjxP0oQMSpWytKCrFkCkJ0So3RQl3WixYV3miK0YjJnM=</dsig:SignatureValue>
    <ds:KeyInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
    </ds:KeyInfo>
</dsig:Signature>

Как вы можете видеть выше, фрагмент подписи с сервера OpenSSO не содержит спецификатор пространства имен, как указано в спецификации SAML Bindings.

Последним вариантом для меня было бы сделать некоторый массаж SAMLResponse, который публикуется для добавления пространства имен к элементам подписи, чтобы библиотеки OpenSAML работали.

Любые идеи о том, как решить эту проблему с помощью библиотек OpenSAML, высоко ценятся.

Заранее спасибо CJ

Ответы [ 2 ]

0 голосов
/ 21 июня 2012

Мы используем библиотеку ComponentSpace SAML 2.0 и столкнулись с аналогичной проблемой с клиентом, который использовал ADFS в качестве своего поставщика удостоверений.Элементы XML, сгенерированные их сервером ADFS, не были индивидуально квалифицированы, как в первом примере, и я изначально думал, что это проблема.

Оказывается, это действительный XML, и проблема не в этом.В нашем случае библиотека ComponentSpace имела разные методы для обработки подписанных утверждений по сравнению с неподписанными утверждениями.Как только мы переключились на проверку подписанных утверждений, это сработало.

Библиотека OpenSAML должна быть способна обрабатывать неквалифицированные элементы XML.Вы можете сообщить об этом как о проблеме специалистам по обслуживанию библиотеки.

0 голосов
/ 05 ноября 2010

Возможно, вы сможете выполнить некоторые манипуляции с DOM для восстановления XML. Например, вот некоторый код, который мне пришлось написать, чтобы исправить некоторые атрибуты пространства имен в SAML Response XML от клиента (на самом деле, это было то, что пространства имен были определены в элементе Response, но утверждение нужно было извлечь и нужно было сохранить пространства имен). *

Element assertionElem = assertion.getDOM();

if (!assertionElem.hasAttribute("xmlns:saml")) {
   assertionElem.setAttribute("xmlns:saml", "urn:oasis:names:tc:SAML:2.0:assertion");
}

if (!assertionElem.hasAttribute("xmlns:ds")) {
   assertionElem.setAttribute("xmlns:ds", "http://www.w3.org/2000/09/xmldsig#");
}

String assertionXml = Serializer.serializeXml(assertionElem, true, true);

Возможно, вы можете просто добавить атрибут xmlns = "http://www.w3.org/2000/09/xmldsig#" в Signature, а затем setDOM() для обновления. Вопрос в том, получит ли samlResponse.getSignature().getDOM() вам XML или вам нужно будет получить DOM для всего ответа и извлеките из него элемент Signature.

Конечно, на самом деле клиент не должен отправлять вам неправильно XML с пространством имен, но мы знаем, как это происходит.

...