我正在尝试签署一些 XML 文件,我设法做得很好,但我找不到检查签名的方法,接收器服务很好地接受它(xml),但它在签名上发现错误。
我检查了 Web 服务的文档,他们说,签名值每行最多可以有 76 个字符,每次加载或编辑 xml 文件时我都必须保留.whitespace。
这是我的 xml 文件一旦输出(我编辑了一些安全值)puu.sh/d6lwC/25eb2a0d02.png (请注意两个签名值如何是没有空格的长行。
这就是我认为它应该看起来的样子:puu.sh/d6lCV/48b0cc0cd7.png
这是应该按照服务文档的 xml 文件:puu.sh/d6ltJ/bd8e25a4b4.png
这是我的签名代码
SignedXml signedXml = new SignedXml(xmldocument);
signedXml.SigningKey = certificado.PrivateKey;
Signature XMLSignature = signedXml.Signature;
Reference reference = new Reference();
reference.Uri = referenciaUri;
XMLSignature.SignedInfo.AddReference(reference);
KeyInfo keyInfo = new KeyInfo();
keyInfo.AddClause(new RSAKeyValue((RSA)certificado.PrivateKey));
keyInfo.AddClause(new KeyInfoX509Data(certificado));
XMLSignature.KeyInfo = keyInfo;
signedXml.ComputeSignature();
XmlElement xmlDigitalSignature = signedXml.GetXml();
xmldocument.DocumentElement.SelectSingleNode(para).AppendChild(xmldocument.ImportNode(xmlDigitalSignature, true));
我的问题是:
如何在不损坏 xml 本身的其他核心值的情况下轻松拆分签名值的行,从而使 web 服务能够正确读取和验证 xml 文件的签名?
在此先感谢,并原谅我蹩脚的英语。
他以某种方式设法通过 php 将 base64 值按块和 76 长度与此代码拆分来解决我的问题
// Base64 encoding
$SignatureValue = rtrim(chunk_split(base64_encode($SignatureValue_bruto), 76));
我怎样才能用 c# 实现这一点?