使用XSD - xmldsig验证签名的XML

本文关键字:XML 验证 XSD xmldsig 使用 | 更新日期: 2023-09-27 18:03:16

我是XMLDSig的新手。我的XML需要签名。在我所在的项目中,我需要在符号之前和符号之后根据XSD验证XML。

我不太了解XSD,但我认为这里有一个导入到另一个XSD。这就是我的麻烦开始的地方。我的XSD文件是大。Xsd 这是它开始的样子

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
           xmlns:ds="http://www.w3.org/2000/09/xmldsig#"
    elementFormDefault="qualified">
    <xs:import namespace="http://www.w3.org/2000/09/xmldsig#"
        schemaLocation="xmldsig-core-schema.xsd"/>

在我的代码c#中,我使用了一些我在互联网上找到的代码,这是有效的,因为当我尝试针对XSD验证XML时,它会显示发现的错误。但是当我试图验证一个签名的XML时,我的麻烦就开始了。

如果我按原样使用类,不做任何更改。当我使用函数pathSchema:

添加模式时
SchemaSet.Add(null, pathSchema);  //pathSchema is the path where my xsd file is.

我得到这个错误:

The 'http://www.w3.org/2000/09/xmldsig#:Signature' element is not declared.

如果我是对的,这是因为XML签名有一些像这样的标签:

<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#" Id="xmldsig-aae8151c-b8db-4525-bfb1-0b3cebdd1dbf">
<ds:SignedInfo>
<ds:CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
<ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"/>
<ds:Reference URI="#xmldsig-aae8151c-b8db-4525-bfb1-0b3cebdd1dbf-keyinfo">
<ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
<ds:DigestValue>p4U9Np1nKtjWPPwp2mOcIimRjUy+RuQIPr2hVdY5R2E=</ds:DigestValue>
</ds:Reference>

我以前读过一些帖子,在其中一个帖子中,我认为有人手动添加了XSD。因此,我下载了XSD并将其放入本地路径,然后在代码中添加:

    XElement xsdMarkup2 = XElement.Load(@"C:'XMLXSD'xmldsig-core-schema.xsd");
    settings.Schemas.Add(null, xsdMarkup2.CreateReader());

错误"签名元素未声明"不会出现。但是,验证器不再验证已签名的XML。因为我删除了一些标签,类说:没有错误。

使用XSD - xmldsig验证签名的XML

好了,我终于解决了。

我用了这个溶液,这是各种溶液的混合物。我下载了xmldsig-core-schema。xsd并编辑它,因为它有一些带有注释的行,当我试图验证xml时,它抛出一个异常,说xsd模式中的第一行必须是

之类的东西
<schema xmlns="http://www.w3.org/2001/XMLSchema"

这是c#

中代码的一部分
                XmlSchemaSet ss = new XmlSchemaSet();
                ss.Add(null, @"C:'Masive.xsd");
                XmlReaderSettings settings2 = new XmlReaderSettings();
                settings2.DtdProcessing = DtdProcessing.Parse;
                XmlReader reader = XmlReader.Create(@"C:'xmldsig-core-schema.xsd", settings2);
                ss.Add(null, reader);
                ss.Compile();

我知道这不是最好的方法(我猜),但它对我有效。