C# XMLDSig X509SerialNumber太大,不能为int,XSD验证失败
我试图使用X509证书创建和创建XMLDSig。我从MS()运行逐字记录示例,该示例生成下面的XML。XML的问题是X509SerialNumber字段太长,不能是int,XSD指定它必须是int。因此,当我尝试对签名进行XSD验证时,它失败了 我收到的错误消息是: “”元素无效-根据其数据类型“”,值“72620403608401703770138453672807553309”无效-字符串“72620403608401703770138453672807553309”不是有效的整数值 如何获取X509SerialNumber的正确值 提前谢谢C# XMLDSig X509SerialNumber太大,不能为int,XSD验证失败,c#,digital-signature,x509certificate,x509certificate2,xml-dsig,C#,Digital Signature,X509certificate,X509certificate2,Xml Dsig,我试图使用X509证书创建和创建XMLDSig。我从MS()运行逐字记录示例,该示例生成下面的XML。XML的问题是X509SerialNumber字段太长,不能是int,XSD指定它必须是int。因此,当我尝试对签名进行XSD验证时,它失败了 我收到的错误消息是: “”元素无效-根据其数据类型“”,值“72620403608401703770138453672807553309”无效-字符串“72620403608401703770138453672807553309”不是有效的整数值 如何获
<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>
根据序列号可以预期包含长整数:
证书用户必须能够处理多达20个八位字节的serialNumber值。符合条件的CA不得使用长度超过20个八位字节的serialNumber值
(第4.1.2.2节关于序列号)
您的序列号726204306 8401703770 1384536728 07553309只有38位数字,即使是十六进制数字,也很容易形成一个20字节长的整数
在(和)中,元素X509SerialNumber
定义为
<element name="X509SerialNumber" type="integer"/>
根据整数的定义
允许任意整数值:
整数通过将fractionDigits的值固定为0,从十进制派生而来。这就产生了整数的标准数学概念。整数的值空间是无穷集{…,-2,-1,0,1,2,…}。整数的基类型是decimal
(第3.3.13节)
因此,您可能需要检查模式文件或XSD验证器
编辑
虽然您的代码是基于而不是我的答案,但这并没有什么区别,因为在这两种情况下,X509SerialNumber
被定义为一个整数
,没有进一步的限制
因此,这是验证器的问题。我不知道这是一个bug还是仅仅是一些配置或定制问题。用于
xs:integer
的.NET XSD验证器试图通过将值解析为C#十进制(,)来验证该值
十进制数的范围为从正79228162514264337593543950335到负79228162514264337593543950335(),或28.79位
该限值不超过最低限值:
注:所有最小一致性处理器必须支持最小为18位的十进制数字(即,总数字为18位)。但是,最低限度符合要求的处理器可以对其准备支持的最大小数位数设置应用程序定义的限制
如果您觉得这会妨碍这些类型的有效使用(不仅仅是测试场景,尽管这些场景也很重要),那么您可以在这里搜索问题以进行升级投票(或者如果没有,请创建一个新问题)。mkl,感谢您的回复。我已经用我正在使用的XSD文件和我用来验证XSD的代码更新了这个问题。我可能在XSD检查中做错了什么吗?@jhilden您的XMLdsig版本还将X509SerialNumber
定义为integer。
因此,这是验证器的问题。我不知道这是一个bug还是仅仅是一些配置或定制问题。嗨,你解决过这个问题吗?我今天也有同样的问题。我很难相信.NET System.Xml库有错。。。。另外,我在Notepad++的XML插件中也遇到了同样的验证错误——因此有两个验证器据称现在有问题……对不起,Simon,但我认为我从未解决过这个问题。也许手动更新XSD是关键。嗯,我不喜欢这样做,但这似乎是我唯一的选择。不敢相信.NETXSD验证器已经有2年的错误行为了,而且还没有得到修复!我将把xsd改为string,并在解析后自己进行数字检查
<element name="X509SerialNumber" type="integer"/>