2

我与外部 WebService 建立了连接,该服务运行了很长时间,直到 2018 年 5 月中旬。突然,我开始收到 CryptographicException 消息“格式错误的 XML 签名”。我的调查告诉我以下信息:

异常从 LoadXml(signature); 行抛出。在继承自 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是一样的

该错误始于 2018 年 5 月 16 日,并且在该日期服务器安装了此安全更新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 上

4

1 回答 1

1

我们找到了解决方案!似乎 System.Security 更新强制对 XML 签名进行更严格的验证。

在我们收到的 XML 中,签名元素的 id 属性写为“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”才可以验证......不过,我怀疑我们是否能通过微软,将其回滚:D

于 2018-06-27T10:53:15.990 回答