【发布时间】:2014-11-26 16:13:07
【问题描述】:
我正在尝试签署一些 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# 实现这一点?
【问题讨论】:
-
我找到了这段代码并实现了它,但我无法拆分base64字符串的总数puu.sh/d6mtC/4f7306e9b9.png
-
也许开始看看那些 php 函数真正做了什么,然后在 c# 中做 :-) rtrim 修剪字符串的右侧。 Chunk_split 每 76 个字符(由输入参数定义)拆分一个字符串,base64_encode 只是一个简单的 base64 编码。 :-) 结合起来,你会得到答案!
-
Karl,我同意,但我不确定它是否有效puu.sh/d6omi/e931d1a79d.png
标签: c# xml base64 xml-signature xml-dsig