在 c# 中将 Object 标记添加到 X509Certificate2
Posted
技术标签:
【中文标题】在 c# 中将 Object 标记添加到 X509Certificate2【英文标题】:Adding Object tag to the X509Certificate2 in c# 【发布时间】:2021-06-08 06:20:34 【问题描述】:我在将 Object 标记添加到我的签名时遇到问题,因为我们的参与者需要它位于已签名 XML 的签名中。 我需要将波纹管对象标签添加到我的签名中:
<ds:Object>
<xades:QualifyingProperties xmlns:xades="http://uri.etsi.org/01903/v1.3.2#">
<xades:SignedProperties Id="_aba0ee84-5f37-499e-a8e8-caa7f398341c-signedprops">
<xades:SignedSignatureProperties>
<xades:SigningTime>2019-02-15T21:09:10+13:00</xades:SigningTime>
</xades:SignedSignatureProperties>
</xades:SignedProperties>
</xades:QualifyingProperties>
</ds:Object>
我目前的签名看起来像:
<MyElement xmlns="samples">Example text to be signed.
<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/2001/04/xmldsig-more#rsa-sha256"/>
<Reference URI="">
<Transforms>
<Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
</Transforms>
<DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
<DigestValue>Kglqb8fjGmMi2n4W8qXldBIY7VBi0xbNn+dZml7H3xw=</DigestValue>
</Reference>
</SignedInfo>
<SignatureValue>Iz5LOjZGefMHvIYs/cr1Vmrg/9gXPDGpJetBEx+k/yzHVAdJf18P2/udFkeOoVMCpVUnNn+H4eVihD2idqg7SMosZeFA4LCQC2/Wn7GCE6k+y0mivCtFZTaXu0yUbwDGWDBvvqMUT87uaRx4o61cm7V3DH8wOUJ05mKtoVFpG20=</SignatureValue>
</Signature>
</MyElement>
我需要的最终签名应该是这样的:
<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
<ds:SignedInfo>
<ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
<ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
<ds:Reference URI="#_33d232d2-4591-4b49-b28d-3cb825fbeaa4">
<ds:Transforms>
<ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
</ds:Transforms>
<ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
<ds:DigestValue>uFw2hAp5tSL4VidzHtTvv3aziis=</ds:DigestValue>
</ds:Reference>
<ds:Reference Type="http://uri.etsi.org/01903/v1.3.2#SignedProperties" URI="#_aba0ee84-5f37-499e-a8e8-caa7f398341c-signedprops">
<ds:Transforms>
<ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
</ds:Transforms>
<ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
<ds:DigestValue>X01eQjqcHvYtQbFkpNT7WcvBSxI=</ds:DigestValue>
</ds:Reference>
<ds:Reference>
<ds:Transforms>
<ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
</ds:Transforms>
<ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
<ds:DigestValue>OCCzP5CU0TAgyYSLMR+SIMchxrE=</ds:DigestValue>
</ds:Reference>
</ds:SignedInfo>
<ds:SignatureValue>b8AhGMpa+fK6Q5q/HXiPttGIKn2PMXc/GQSrxnI+jnW9Agg6E6R/q+cwMKiYkdlskI/P0UAdwxd+
KQ44k6r2OET4HjMyatG99HFQnS0C0awVO7CPF6cO9069DDmXplWIkHIoBPWSgXh7SQHMpaQihJYo
S9iVr5+qhYQBZYCVwHg=</ds:SignatureValue>
<ds:KeyInfo Id="_33d232d2-4591-4b49-b28d-3cb825fbeaa4">
<ds:X509Data>
<ds:X509IssuerSerial>
<ds:X509IssuerName>CN=Test CA, O=Test Institution, C=BD</ds:X509IssuerName>
<ds:X509SerialNumber>12345678</ds:X509SerialNumber>
</ds:X509IssuerSerial>
</ds:X509Data>
</ds:KeyInfo>
<ds:Object>
<xades:QualifyingProperties xmlns:xades="http://uri.etsi.org/01903/v1.3.2#">
<xades:SignedProperties Id="_aba0ee84-5f37-499e-a8e8-caa7f398341c-signedprops">
<xades:SignedSignatureProperties>
<xades:SigningTime>2019-02-15T21:09:10+13:00</xades:SigningTime>
</xades:SignedSignatureProperties>
</xades:SignedProperties>
</xades:QualifyingProperties>
</ds:Object>
</ds:Signature>
可以查看链接中的c#代码:https://docs.microsoft.com/en-us/dotnet/api/system.security.cryptography.xml.x509issuerserial?view=net-5.0
【问题讨论】:
在这个帖子中查看我的解决方案:***.com/questions/46722997/… 我需要将此对象字段添加到我的签名中,我在您的回答中没有找到任何相关信息!!! 我的代码标签名称不同但过程相同。您需要修改 CreateSubject 以创建所需的 xml 标记。当您调用 SignXmlWithCertificate 时,已签名的节点将被添加到 XML 中。 但是这个 Id="_aba0ee84-5f37-499e-a8e8-caa7f398341c-signedprops" 怎么样 如果您可以自定义您的代码,那将非常有帮助。 【参考方案1】:这是第一步:
public static void CreateKeyInfo(XmlElement xSubject)
string keyinfo = "<ds:KeyInfo Id=\"_33d232d2-4591-4b49-b28d-3cb825fbeaa4\">"+
"<ds:X509Data>" +
"<ds:X509IssuerSerial>" +
"<ds:X509IssuerName>CN=Test CA, O=Test Institution, C=BD</ds:X509IssuerName>" +
"<ds:X509SerialNumber>12345678</ds:X509SerialNumber>" +
"</ds:X509IssuerSerial>"+
"</ds:X509Data>" +
"</ds:KeyInfo>";
xSubject.InnerXml = keyinfo;
public static void CreateObject(XmlElement xSubject)
string keyObject = "<ds:Object>" +
"<xades:QualifyingProperties xmlns:xades=\"http://uri.etsi.org/01903/v1.3.2#\">" +
"<xades:SignedProperties Id=\"_aba0ee84-5f37-499e-a8e8-caa7f398341c-signedprops\">" +
"<xades:SignedSignatureProperties>" +
"<xades:SigningTime>2019-02-15T21:09:10+13:00</xades:SigningTime>" +
"</xades:SignedSignatureProperties>" +
"</xades:SignedProperties>" +
"</xades:QualifyingProperties>" +
"</ds:Object>";
xSubject.InnerXml = keyObject;
【讨论】:
这只会添加一些静态对象,我认为 SignedProperties 的 Id 属性来自其他地方。如果你解决了,我会标记你的答案。提前致谢。 需要将ID添加到CrtateObject的参数列表中。然后修改字符串keyObject,使ID使用参数列表中的值,而不是固定的。您还希望对 SigningTime 等其他属性执行类似操作。 添加对 signedproperties 和 KeyInfo 的引用是一个挑战,因为这是一个附加在末尾的静态对象。 查看我创建 SOAP 的链接。 main 方法构建 xml。看我调用方法 CreateSubject(subject); 我已经检查了你的代码很棒,但我需要添加对签名属性和 keyinfo 元素的引用,比如这样。以上是关于在 c# 中将 Object 标记添加到 X509Certificate2的主要内容,如果未能解决你的问题,请参考以下文章
如何在 C# 标记中将 Frame 的高度设置为等于其宽度?