Использование двух сертификатов и одной подписи - PullRequest
0 голосов
/ 29 августа 2018

В настоящее время я работаю над функцией единого входа для клиента.

Наше приложение, если в этом есть необходимость, выполнит аутентификацию с использованием функции единого входа при запуске и прекратит работу в случае сбоя.

Я прочитал много объяснений и видел много примеров в Интернете.

То, что я совсем не понимаю, это сертификаты. В частности, кажется, что в операции используются два (разных?) Сертификата. Один из них хранится на моей стороне как константа, а другой отправляется в ответе SAML в элементе подписи следующим образом:

<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
    <ds:SignedInfo>
        <ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
        <ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" />
        <ds:Reference URI="#id-2710abae3b0457ad0c241eac043769ae78c83189">
            <ds:Transforms>
                <ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" />
                <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
            </ds:Transforms>
            <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
            <ds:DigestValue>???</ds:DigestValue>
        </ds:Reference>
        <ds:Reference URI="#id-266b413f5282d3da62de3963e5e25cb0782e1a05">
            <ds:Transforms>
                <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
            </ds:Transforms>
            <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
            <ds:DigestValue>???</ds:DigestValue>
        </ds:Reference>
    </ds:SignedInfo>
    <ds:SignatureValue>???</ds:SignatureValue>
    <ds:KeyInfo Id="id-266b413f5282d3da62de3963e5e25cb0782e1a05">
        <ds:X509Data>
            <ds:X509Certificate>???</ds:X509Certificate>
        </ds:X509Data>
    </ds:KeyInfo>
</ds:Signature>

Поля, помеченные как "???" клиент не дал мне в образце ответа.

Что касается другого сертификата, хороший пример этого будет здесь: https://github.com/onelogin/dotnet-saml в "App_Code / AccountSettings.cs".

Кроме того, в XML есть также подпись и два поля "DigestValue", которые, как представляется, также содержат данные Base64 в других онлайн-примерах.

Итак, мой вопрос: является ли локальный сертификат таким же, как у xml, и если нет, то как именно они связаны, и имеют ли отношение подпись и DigestValues ​​в этих отношениях?

Что касается контекста, я пытаюсь протестировать свою функцию единого входа, и, похоже, все работает, кроме сертификата, который я не могу понять, как тестировать без реальных значений. Это может быть подделано? SignedXml.CheckSignature всегда возвращает false независимо от того, что я поместил в XML, даже «реальные» примеры (найденные в Интернете).

1 Ответ

0 голосов
/ 19 сентября 2018

SAML основан на круге Доверия.

IdP доверяют на SP и SP доверяют на IdP.

Способ реализации «доверия» заключается в том, что IdP должны регистрировать метаданные SP (entityID, конечные точки и публичные сертификаты для проверки подписи и шифрования), и таким же образом SP должны регистрировать метаданные IdP.

Исходя из вашего сообщения, кажется, что вы реализуете SP, поэтому первым шагом является регистрация на SP метаданных IdP, как только это будет сделано, на SP вы будете хранить ID объекта IdP, его конечные точки, а также публичный сертификат IdP. Этот сертификат ДОЛЖЕН совпадать со значением ds: X509Certificate Подписи, включенной в SAMLResponse, отправляемый IdP в SP во время процесса SSO.

...