SignedXml.LoadXml () создает исключение CryptographicException - PullRequest
0 голосов
/ 26 июня 2018

У меня есть соединение с внешним WebService, который работал безупречно целую вечность до середины мая 2018 года. Внезапно я начал получать CryptographicException с сообщением «Malformed XML Signature».Мое расследование говорит мне следующее:

Исключение выдается из строки LoadXml (подпись);в классе, который унаследован от System.Security.Cryptography.Xml.SignedXml

. Вот код:

public bool CheckAssertionSignature()
    {
        if (Xml == null || Xml.DocumentElement == null)
            return false;

        var xmlass = Xml.DocumentElement.LocalName == "Assertion" ? Xml.DocumentElement : Xml.GetElementsByTagName("Assertion", Namespaces.Saml)[0] as XmlElement;
        var signature = xmlass.GetElementsByTagName("Signature", Namespaces.Ds)[0] as XmlElement;
        if (signature == null) return false;
        LoadXml(signature);
        var cert = KeyInfo.Cast<KeyInfoX509Data>().Select(d => d.Certificates[0] as X509Certificate2).FirstOrDefault(c => c != null);

        return cert != null && CheckSignature(cert, true);
    }

Что я выучил до сих пор: коллега и я проверилиКод локально на двух разных версиях Windows 10. Его версия новее, чем у меня.Он получает ошибку, а я нет.

XML-код, обработанный кодом, идентичен

Ошибка началась 16 мая 2018 года, и в этот день сервер установил это обновление для системы безопасности https://support.microsoft.com/da-dk/help/4099635/security-and-quality-rollup-for-net-framework-3-5-4-5-2-4-6-4-6-1-4-6

Мы знаем, что подобное обновление ранее вызывало похожую проблему: https://support.microsoft.com/en-us/help/3148821/after-you-apply-security-update-3141780-net-framework-applications-enc

Кто-нибудь имеет представление о том, как решить эту проблему (и кто-нибудь еще испытывает проблему)?

PS.Код работает на Windows SRV 2012 R2, и проблема также существует на Windows SRV 2016

1 Ответ

0 голосов
/ 27 июня 2018

Мы нашли решение! Похоже, что обновление System.Security привело к более строгой проверке подписей XML.

В полученном нами XML свойство id элементов Signature записывается как «id». Согласно Схеме для подписей XML (http://www.w3.org/2000/09/xmldsig#) это должен быть «Id». Метод LoadXml до обновления безопасности не вызывал это, но после этого.

Поскольку полученный XML имеет недопустимый атрибут, мы создали следующий обходной путь для изменения атрибута:

if (signature.Attributes.GetNamedItem("id") is XmlAttribute oldId)
{
    signature.Attributes.Remove(oldId);
    if (signature.OwnerDocument != null)
    {
        var newId = signature.OwnerDocument.CreateAttribute("Id");
        newId.Value = oldId.Value;
        signature.Attributes.Append(newId);
    }
}

Хотя мы не понимаем, почему проверка должна быть настолько строгой, что только «Id» подтверждает, что все в порядке ... Тем не менее, я сомневаюсь, что мы доберемся до Microsoft, откатив ее: D

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