Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将SignedXML配置为使用前缀和其他形式对XML文档进行签名?_Xml_Signature_Xml Signature_Signedxml - Fatal编程技术网

如何将SignedXML配置为使用前缀和其他形式对XML文档进行签名?

如何将SignedXML配置为使用前缀和其他形式对XML文档进行签名?,xml,signature,xml-signature,signedxml,Xml,Signature,Xml Signature,Signedxml,我需要使用.NET Core和SignedXml对XML文档进行证书签名,但我不知道如何在签名标记中配置另一方期望的某些元素。我检查了很多文章,都很相似,但我仍然有错误。不幸的是,我不能发送任何好的日志消息,我只有一个一般性的答案,即签名无效 签名的预期内容如下所示。看起来所有细节——标记、前缀、标识符、模式——都是必需的 最大值 信号值 {{someValue}} {{someValue}} 每一个提示都很有用,我不希望得到全面的答案,但我对这些问题中的大部分感兴趣: 如何定义前缀ds和

我需要使用.NET Core和
SignedXml
对XML文档进行证书签名,但我不知道如何在签名标记中配置另一方期望的某些元素。我检查了很多文章,都很相似,但我仍然有错误。不幸的是,我不能发送任何好的日志消息,我只有一个一般性的答案,即签名无效

签名的预期内容如下所示。看起来所有细节——标记、前缀、标识符、模式——都是必需的


最大值
信号值
{{someValue}}
{{someValue}}
每一个提示都很有用,我不希望得到全面的答案,但我对这些问题中的大部分感兴趣:

  • 如何定义前缀
    ds
    ec
  • 如何配置wsse:SecurityTokenReference
  • 在何处查找所有标识符,标记为
    {{someValue}
在与签名XML进行了两周的斗争后,我需要在2021年确认相同的状态,即:

毫不奇怪,在Windows上,签名和证书加密的安全性被如此轻率地使用。这是一个巨大的麻烦,可怕的记录,需要大量的工具


尽管Java郡的同事说,这在国外要简单得多,但我认为问题在于SOAP服务的规范过于复杂。

这是一个部分解决方案,基于前面提到的。假设我们有XML文档要签名:


使用该代码:

使用系统;
使用System.IO;
使用System.Security.Cryptography.X509证书;
使用System.Security.Cryptography.Xml;
使用System.Xml;
命名空间XmlSigner
{
班级计划
{
静态void Main(字符串[]参数)
{
//创建一个新的XML文档。
var doc=新的XmlDocument();
//格式化文档以忽略空白。
doc.PreserveWhitespace=false;
//使用传递的XML文件的名称加载该文件。
doc.Load(新的XmlTextReader(“C:\\Repos\\request.xml”);
//初始化证书。
var certificate=new X509Certificate2(“C:\\Repos\\certificate.pfx”,“youdontguessthispassword”);
//签署文件
var signedDoc=SignSoapBody(单据、证书);
//写入输出文件。
writealText(“C:\\Repos\\signed.xml”,signedDoc.OuterXml);
//验证结果。
if(验证APBodySignature(signedDoc,证书))
WriteLine(“一切看起来都很好,继续前进。”);
其他的
WriteLine(“你搞砸了,回去工作吧。”);
}
私有常量字符串STR_SOAP_NS=”http://schemas.xmlsoap.org/soap/envelope/";
私有常量字符串STR_SOAPSEC_NS=”http://schemas.xmlsoap.org/soap/security/2000-12";
/// 
///对SOAP文档进行签名并向其添加数字签名。
/// 
///注意:许多可选设置应用于
///与所需XML文档匹配的密钥和证书信息
///构造服务器请求。
/// 
/// 
///安装在证书存储中CurrentUser | Personal下的证书的友好名称
/// 
静态公共XmlDocument签名主体(XmlDocument xmlDoc,X509Certificate2证书)
{
//添加搜索名称空间引用以确保我们能够可靠地工作
//不考虑标记命名的任何SOAP文档
XmlNamespaceManager ns=新的XmlNamespaceManager(xmlDoc.NameTable);
AddNamespace(“SOAP”,STR_SOAP_ns);
AddNamespace(“SOAP-SEC”,STR_SOAPSEC_ns);
//抓取body元素-这就是我们创建签名的基础
XmlElement body=xmlDoc.DocumentElement。选择SingleNode(@”//SOAP:body“,ns)作为XmlElement;
if(body==null)
抛出新的ApplicationException(“未找到正文标记”);
//我们只将-addid:Reference编码为#Body
var bodyId=$“id-{Guid.NewGuid()}”;
SetAttribute(“id”,bodyId);
//签名的XML将创建XML签名-XML片段
SignedXml SignedXml=新的SignedXml(xmlDoc);
signedXml.Signature.Id=$“sid-{Guid.NewGuid()}”;
signedXml.SignedInfo.SignatureMethod=”http://www.w3.org/2000/09/xmldsig#rsa-sha1”;
//创建一个KeyInfo结构
KeyInfo KeyInfo=新的KeyInfo();
keyInfo.Id=$“kid-{Guid.NewGuid()}”;
//签名的实际密钥-确保该密钥不为NULL!
signedXml.SigningKey=cert.PrivateKey;
//具体使用数据的颁发者和序列号,而不是默认值
KeyInfoX509Data keyInfoData=新的KeyInfoX509Data();
AddIssuerSerial(cert.Issuer,cert.GetSerialNumberString());
keyInfo.add子句(keyInfoData);
//提供嵌入的证书信息-注意这只是
//用于提供证书信息的消息的特定格式