Подпись проверена правильно с ключом, содержащимся в подписи, но этот ключ не является доверенным - PullRequest
0 голосов
/ 27 августа 2018

Я пытаюсь настроить SAML2 IdP Salesforce в качестве внешнего поставщика в IdentityServer3. Я использую библиотеку SustainSys / Saml2 . Итак, для целей тестирования я скачал SampleIdentityServer3 . и настроил SAML2 IdP как показано ниже

    private void ConfigureSaml2(IAppBuilder app, string signInAsType)
    {
        ServicePointManager.Expect100Continue = true;
        ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12 | SecurityProtocolType.Ssl3;

        var options = new Saml2AuthenticationOptions(false)
        {
            SPOptions = new SPOptions
            {
                EntityId = new EntityId("http://localhost:4589/IdSrv3/Saml2"),    
                MinIncomingSigningAlgorithm = "http://www.w3.org/2000/09/xmldsig#rsa-sha1"
            },
            SignInAsAuthenticationType = signInAsType,
            Caption = "SAML2p",

        };

        UseIdSrv3LogoutOnFederatedLogout(app, options);

        options.SPOptions.ServiceCertificates.Add(new X509Certificate2(
            AppDomain.CurrentDomain.SetupInformation.ApplicationBase + "/App_Data/Sustainsys.Saml2.Tests.pfx"));

        var idp = new IdentityProvider(
            new EntityId("https://XXXXXX-dev-ed.my.salesforce.com"),
            options.SPOptions)
        {
            MetadataLocation = "https://XXXXXX-dev-ed.my.salesforce.com/.well-known/samlidp.xml",
            LoadMetadata = true,                
        };

        options.IdentityProviders.Add(idp);
        app.UseSaml2Authentication(options);
    }

Обратите внимание, что если я не установлю MinIncomingSigningAlgorithm на sh1, то библиотека SustainSys выдаст ошибку.

Sustainsys.Saml2.Exceptions.InvalidSignatureException: подпись алгоритм http://www.w3.org/2000/09/xmldsig#rsa-sha1 слабее, чем минимальный принятый http://www.w3.org/2001/04/xmldsig-more#rsa-sha256. Если вы хотите разрешить этот алгоритм подписи, используйте minIncomingSigningAlgorithm атрибут конфигурации.

Поэтому я установил MinIncomingSigningAlgorithm на "http://www.w3.org/2000/09/xmldsig#rsa-sha1", чтобы избавиться от ошибки.

Но тогда я получаю другую ошибку

Sustainsys.Saml2.Exceptions.InvalidSignatureException: подпись проверено правильно с ключом, содержащимся в подписи, но это ключ не является доверенным.

на основе проблемы # 493 # 735 сертификат в метаданных должен совпадать с сертификатом в ответе SAML2.

В метаданных сертификатом является (начальные и конечные значения уведомления)

  <ds:X509Data>
    <ds:X509Certificate>
       MIIGk... removed from brevity....tmv6J1g==
    </ds:X509Certificate>
  </ds:X509Data>

Но в ответе SAML2 (который регистрируется библиотекой SustainSys)

<samlp:Response xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol" Destination="http://localhost:4589/IdSrv3/Saml2/Acs" ID="_19fd2d8d9aab0401f56fXXXXXXXXX" InResponseTo="id473a52c49f194bXXXXXXXXX"    IssueInstant="2018-08-27T20:10:04.296Z" Version="2.0">
    <saml:Issuer xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion" Format="urn:oasis:names:tc:SAML:2.0:nameid-format:entity">https://XXXXXXX-dev-ed.my.salesforce.com</saml:Issuer>
    <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="#_19fd2d8d9aab0401f56f642dXXXXXXXXXXXXX">
                <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#"><ec:InclusiveNamespaces xmlns:ec="http://www.w3.org/2001/10/xml-exc-c14n#" PrefixList="ds saml samlp" /></ds:Transform>
                </ds:Transforms>
                <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
                <ds:DigestValue>fQiiyd0T57Ztr5BAfMFe9MTrhY0=</ds:DigestValue>
            </ds:Reference>
        </ds:SignedInfo>
        <ds:SignatureValue>
            B6hndlsBgY45J+hm8My2gPVo....removed for brevity....YT88ajt7jQ==
        </ds:SignatureValue>
        <ds:KeyInfo>
            <ds:X509Data>
                <ds:X509Certificate>
                    MIIENz... remove for brevity....y2Ul24Jyc4V/jJN
                </ds:X509Certificate>
            </ds:X509Data>
        </ds:KeyInfo>
        </ds:Signature>
        <samlp:Status>
            <samlp:StatusCode Value="urn:oasis:names:tc:SAML:2.0:status:AuthnFailed" />
        </samlp:Status>
    </samlp:Response>

смотрит на X509Certificate значение в метаданных и в ответе SAML2 они не совпадают.

Вопрос
Соответствует ли значение X509Certificate в ответе SAML2 значению X509Certificate в метаданных? Если да, то почему библиотека SustainSys не может всегда использовать значение X509Certificate из ответа SAML2?

Обновление
Просто чтобы посмотреть, будет ли работать соответствие значений, я сохранил значение сертификата из ответа SAML2 в отдельный файл .cer. Затем в файле KeyInfoSerializer.cs я обновил метод ReadX509Certificate (этот метод загружает сертификат из метаданных)

    private static SecurityKeyIdentifierClause ReadX509Certificate(XmlReader reader)
    {
        reader.ReadStartElement("X509Certificate", SignedXml.XmlDsigNamespaceUrl);
        ((XmlDictionaryReader)reader).ReadContentAsString();

        var cer = new X509Certificate2(AppDomain.CurrentDomain.SetupInformation.ApplicationBase + "/App_Data/salesforcepublickey.cer");
        var clause = new X509RawDataKeyIdentifierClause(cer);
        reader.ReadEndElement();
        return clause;
    }

Тем не менее, он по-прежнему выдает ошибку The signature verified correctly with the key contained in the signature, but that key is not trusted.

1 Ответ

0 голосов
/ 28 августа 2018

Нашли.
Это была проблема со стороны Salesforce. В Saleforce, когда я проверяю журналы Identity->Identity Provider Event Log, я вижу ошибку Error: User does not have access to this service provider

Для этого пользователю не было дано разрешение. Даже если пользователь является системным администратором, доступ к подключенному приложению по умолчанию не предоставляется. Чтобы получить разрешение, перейдите в «Управление пользователями -> Пользователи» и нажмите «Изменить» для пользователя, которого вы тестируете. Нажмите ссылку на имя профиля .e.g. Системный администратор. Это займет на странице профиля. Вы можете прокрутить ниже до «Доступ к подключенному приложению», и вы увидите, что доступ не предоставляется. Дайте доступ, нажав изменить профиль в верхней части страницы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...