当前位置: 首页 > 知识库问答 >
问题:

XMLDSig X509序列号太大而无法成为整型,XSD 验证失败

董光霁
2023-03-14

我尝试使用X509证书创建和XMLDSig(http://msdn.microsoft.com/en-us/library/system.security.cryptography.xml.x509issuerserial.aspx)其生成下面的XML。XML的问题是X509SerialNumber字段太长,不能是int,这是XSD指定的必须是的。因此,当我尝试对签名进行XSD验证时,它失败了。

我得到的错误消息是:'http://www.w3.org/2000/09/xmldsig#: X509SerialNumber'元素无效-值'72620403068401703770138453672807553309'根据其数据类型'http://www.w3.org/2001/XMLSchema无效:整数'-字符串'72620403068401703770138453672807553309'不是有效的整数值。

如何获取X509SerialNumber的正确值?

提前感谢!

<Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
  <SignedInfo>
    <CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315" />
    <SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" />
    <Reference URI="">
      <Transforms>
        <Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" />
      </Transforms>
      <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
      <DigestValue>zSI5ZAMmQ+8u7R2rP7aAPT6nNQw=</DigestValue>
    </Reference>
  </SignedInfo>
  <SignatureValue>Tx4rqqDae4vdi5sTjARf0AlBiIGWnx2D8ET+ogGD9FtjrX4ZuYlsOG03Zk5KPKDpC/T45XlWaZpZdCtvAWtv0zwL1/jXxlU2BomQFNXm7rb9YoqlTh8nISStiZKizhmMQynW6GRsXGIpkK37Hnip4c8H1U+eSC/taKW4oyUmg40W64+ZyntovpBt2GqIJQu4AFvMfiF2azV9pg/qZ7IYNOgwmrUG6F0t2RhT2hqR9YRePjrfyIebZvYrLwjTQPXGOzzc2utRILAEhzGNSqsvpf5YeVrmuX75E8Zs3JuaicXu4mgDPYxNNVE2membNQMl6ggllfFjxPnvIofbb/KJ4Q==</SignatureValue>
  <KeyInfo>
    <X509Data>
      <X509IssuerSerial>
        <X509IssuerName>CN=XMLDSIG_Test</X509IssuerName>
        <X509SerialNumber>72620403068401703770138453672807553309</X509SerialNumber>
      </X509IssuerSerial>
      <X509Certificate>MIIDIDCCAgygAwIBAgIQNqIuTm7QSrZClm5/JrLZHTAJBgUrDgMCHQUAMCMxITAfBgNVBAMeGABYAE0ATABEAFMASQBHAF8AVABlAHMAdDAeFw0xMDAxMDEwNjAwMDBaFw0yMDAxMDEwNjAwMDBaMCMxITAfBgNVBAMeGABYAE0ATABEAFMASQBHAF8AVABlAHMAdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMl9hSOn53/2W2//EC8HUgwO7Hwpqx0/yTwth0w3amefwZcfu/+7k9rB+mnviCy6G/9uGzb0Mld+L3RVXisAx9zr2l6LVFjzImY1alwZ01z6AiDdllFPqO7BoSJSozMh0k+vdVQYR3lvgLNyKxXmrTayIWhioQeteIo6HuChz8HI/DNdzoO8axGbLuhy34pogG1gAQr3pTn16Pkd4Mu02KoRz90dryt09wuAk1P/jsePYHBeLQeJSLGojWp1sqypxr25FQiqJantyVLXRRmv7IauTTThSSNrREMcTzbpCx7B4tvyocNwGZysYcdJVsyjbxJRLqutQDlID6QykqkL9O8CAwEAAaNYMFYwVAYDVR0BBE0wS4AQ0N2edJbnLN9AE7hLcICPNaElMCMxITAfBgNVBAMeGABYAE0ATABEAFMASQBHAF8AVABlAHMAdIIQNqIuTm7QSrZClm5/JrLZHTAJBgUrDgMCHQUAA4IBAQC5Nf5SGjqIzQqVnwJbP22RqSHrITAPlymGYfP/qST8Q9V5h5aX8idcGMt3lShUbexXAlKcpQLO4ZzUrjjP3H5Jc659sRSDaeqHGXE0ZMTJpvwA871WH/sGZ8tB7/yuHVsP9hPTImwwDCWx9mYDz8LxpvK11beq/tEilZQxLTvMP0MuT5A6YdCcCc4GkeDV0KVFF+VLEO8OkaWDVXUNMe/AJBHrXuHbQPrUb7s67FKH+b/2GVjBBkM6YI9JtL/A96Y2uf6drhOz6C7wfky2XQOe/7v87/YGEshObBawBA1/OB1AVa+A2WVOosisEGi7iJqszQTdF6TLqGB5eDsiZCH2</X509Certificate>
    </X509Data>
  </KeyInfo>
</Signature>

我正在使用来自以下URL的XSD:

http://www.w3.org/2000/09/xmldsig#

下面是我验证XSD的代码:

    XmlElement xmlDigitalSignature = signedXml.GetXml();

    var xEl = XElement.Parse(xmlDigitalSignature.OuterXml);
    var xDoc = XDocument.Load(xEl.CreateReader());

    XSDValidator.ValidateSignature(xDoc);


public class XSDValidator
{
    public static void ValidateSignature(XDocument document)
    {
        var schemaSet = new XmlSchemaSet();
        var assm = Assembly.GetExecutingAssembly();
        using (var stream = assm.GetManifestResourceStream("JayTest1.XMLSignature.xsd"))
        {
            schemaSet.Add(XmlSchema.Read(stream, null));
        }
        var isValid = true;
        string errorMessage = null;

        document.Validate(schemaSet, (o, e) =>
        {
            errorMessage = e.Message;
            isValid = false;
        });
        if (!isValid)
        {
            Console.WriteLine("XSD is not valid: " + errorMessage);
        }
        else
        {
            Console.WriteLine("GOOD!");
        }
    }
}

共有2个答案

易炳
2023-03-14

的。< code>xs:integer的. NET XSD验证器尝试通过将该值解析为C# 十进制 (https://referencesource.microsoft.com/#System来验证该值。Xml/System/Xml/Schema/datatype implementation . cs,2874,https://referencesource.microsoft.com/#System.Xml/System/Xml/XmlConvert.cs,3e8716fb1936c48d)。

十进制的范围为正79228162514264337593543950335到负79228162524264337375933950335(https://docs.microsoft.com/en-us/dotnet/api/system.decimal?view=netframework-4.7)或28.79位。

此限制超过最低限度http://www.w3.org/TR/2001/REC-xmlschema-2-20010502/#decimal:

注意:所有·最低符合·处理器·必须·支持至少18位十进制数字(即·总计数字·为18)的十进制数字。但是,·最低符合·处理器·可能·对它们准备支持的最大十进制位数设置应用程序定义的限制...

如果您认为这会抑制这些类型的有效用法(不仅仅是测试场景,尽管这些也很重要)https://github.com/dotnet/corefx/issues/将是搜索问题以进行投票的地方(或者没有找到,创建一个新问题)。

尉迟华翰
2023-03-14

根据RFC 5280,序列号可以包含长整数:

证书用户必须能够处理最多20个八位字节的序列号值。符合条件的CAs不得使用超过20个八位字节的序列号值。

(第4.1.2.2节序号)

您的序列号726204306 8401703770 1384536728 07553309只有38位数字,即使它们是十六进制数字,也很容易形成一个20字节长的整数。

在 XML 签名语法和处理(第二版)(和架构文件)中,元素 X509SerialNumber 定义为

<element name="X509SerialNumber" type="integer"/>

根据整数的定义,它确实允许任意整数值:

通过将fractionDigits的值固定为0,从decimal派生出integer。这就产生了整数的标准数学概念。整数的值空间是无限集合{...,-2,-1,0,1,2,...}.整数的基本类型是十进制。

(XML模式第2部分第3.3.13节:数据类型)

因此,您可能需要检查您的模式文件或XSD验证器。

编辑

虽然您的代码基于XML签名语法和处理,而不是像我的答案那样基于XML签名语法和处理(第二版),但这并没有区别,因为在这两种情况下,X509SerialNumber都被定义为整数而没有进一步的限制。

因此,这是您的验证器的问题。无论是一个错误还是仅仅是一些配置或自定义问题,我不知道。

 类似资料:
  • 我试图得到一个非常大的数字的平方根,但我得到了错误:deltaSqrt=pow(delta,0.5)溢出错误:长int太大,无法转换为浮动 在我的情况下,delta等于: 509752415912430571120834697697209399451791855931983919398681840231635980912719828796195714368058047566515853712321

  • 请告诉我是否有方法覆盖spring integration XSD validator引发的默认soap错误。默认情况下,生成的故障是客户端故障,但我想将其更改为自定义故障代码。是AbstractSoapFaultDefinitionExceptionResolver。getFaultDefinition()是执行此操作的正确位置?

  • 如果 XML 是由 JAXB 类(而不是由 XSD)生成的,那么我没有要验证的 XSD。如何验证 XML?JAXB 在开始取消编组之前是否会自动对 XML 进行验证?

  • 我在验证xml和xsd时遇到问题。我从xsd模式中得到这个错误。 src解决方案。4.2:解析组件“urn:id”时出错。检测到“urn:id”位于命名空间“urn:schemas microsoft com:xml-diffgram-v1”中,但此命名空间中的组件无法从架构文档中引用virtual://server/schema.xsd。如果名称空间不正确,可能需要更改“urn:id”的前缀。如

  • 我有一个类,它用一个xml点击一个安全的URL(以https开头),然后在最后处理xml并返回响应。但在这样做的同时,我也遇到了一些例外<代码>javax。网ssl。例外:太阳。安全验证器。ValidatorException:PKIX路径生成失败:sun。安全供应商。certpath。SunCertPathBuilderException:找不到请求目标的有效认证路径 我在谷歌上搜索了很多,找到