我们正在从使用 java 的第三方接收签名的 xml。我们的 .NET 实现会正确验证签名,除非 xml 包含 字符参考。
看起来 .NET 在 c14n 进程中的某处删除了该换行符。
我用下一个 xml 在 c# 中运行了一些测试:
var xml = "<a>something \nsomething\r\n</a>";
Run Code Online (Sandbox Code Playgroud)
使用 c14n 的下一个代码:
public static void c14n(string xml)
{
using (MemoryStream msIn = new MemoryStream(Encoding.UTF8.GetBytes(xml)))
{
var t = new XmlDsigExcC14NTransform(false);
t.LoadInput(msIn);
var o = t.GetOutput() as MemoryStream;
var c14n = Encoding.UTF8.GetString((o as MemoryStream).ToArray());
Console.WriteLine(c14n);
}
}
Run Code Online (Sandbox Code Playgroud)
将产生下一个 xml,这符合w3org规范(每行以 LF 字符结尾):
<a>something
something
</a>
Run Code Online (Sandbox Code Playgroud)
但是,当使用下一个代码查看具有 SignedXml .NET 类签名的 xml 的规范形式时:
public static void SignXml(string …Run Code Online (Sandbox Code Playgroud)