gpt4 book ai didi

c# - SignedXml.CheckSignature 在 .NET 4 中失败,但在 .NET 3.5、3 或 2 中有效

转载 作者:IT王子 更新时间:2023-10-29 04:05:14 26 4
gpt4 key购买 nike

我有一个来自第 3 方网络服务的响应。我用该响应加载 XmlDocument。

  string txt = readStream.ReadToEnd();
response = new XmlDocument();
response.PreserveWhitespace = true;
response.LoadXml(txt);
return response;

现在我想验证是否使用证书对响应进行了签名。我有一个在 msdn 上找到的 VerifyXmlDoc(XmlDocument xmlDoc) 方法.

我知道消息是正确的。

    public bool VerifyXmlDoc(XmlDocument xmlDoc)
{

SignedXml signed = new SignedXml(xmlDoc);

XmlNodeList signatureNodeList = xmlDoc.GetElementsByTagName("Signature");


signed.LoadXml((XmlElement)signatureNodeList[0]);

X509Certificate2 serviceCertificate = null;
foreach (KeyInfoClause clause in signed.KeyInfo)
{
if (clause is KeyInfoX509Data)
{
if (((KeyInfoX509Data)clause).Certificates.Count > 0)
{
serviceCertificate = (X509Certificate2)((KeyInfoX509Data)clause).Certificates[0];
}
}
}


bool result = signed.CheckSignature(serviceCertificate, true);
return result;

}

如果我将项目的目标框架设置为 .NET 3.5、.NET 3 或 .NET 2,效果会很好。结果是真的。但是,如果我将目标框架更改为 .NET 4,则结果为假。(而且我必须使用 .NET 4)

关于如何解决这个问题有什么想法吗?

最佳答案

这是一个已知问题。 .NET 3.5 和 .NET 4.0 之间的规范化实现已更改。

我不知道这是否适用于所有 XML 签名,但以下内容来 self 所做的测试。

将以下 C14N 转换类添加到您的项目中:

public class MyXmlDsigC14NTransform: XmlDsigC14NTransform {
static XmlDocument _document;
public static XmlDocument document {
set {
_document = value;
}
}

public MyXmlDsigC14NTransform() {}

public override Object GetOutput() {
return base.GetOutput();
}

public override void LoadInnerXml(XmlNodeList nodeList) {
base.LoadInnerXml(nodeList);
}

protected override XmlNodeList GetInnerXml() {
XmlNodeList nodeList = base.GetInnerXml();
return nodeList;
}

public XmlElement GetXml() {
return base.GetXml();
}

public override void LoadInput(Object obj) {
int n;
bool fDefaultNS = true;

XmlElement element = ((XmlDocument) obj).DocumentElement;

if (element.Name.Contains("SignedInfo")) {
XmlNodeList DigestValue = element.GetElementsByTagName("DigestValue", element.NamespaceURI);
string strHash = DigestValue[0].InnerText;
XmlNodeList nodeList = _document.GetElementsByTagName(element.Name);

for (n = 0; n < nodeList.Count; n++) {
XmlNodeList DigestValue2 = ((XmlElement) nodeList[n]).GetElementsByTagName("DigestValue", ((XmlElement) nodeList[n]).NamespaceURI);
string strHash2 = DigestValue2[0].InnerText;
if (strHash == strHash2) break;
}

XmlNode node = nodeList[n];

while (node.ParentNode != null) {
XmlAttributeCollection attrColl = node.ParentNode.Attributes;
if (attrColl != null) {
for (n = 0; n < attrColl.Count; n++) {
XmlAttribute attr = attrColl[n];
if (attr.Prefix == "xmlns") {
element.SetAttribute(attr.Name, attr.Value);
} else if (attr.Name == "xmlns") {
if (fDefaultNS) {
element.SetAttribute(attr.Name, attr.Value);
fDefaultNS = false;
}
}
}
}

node = node.ParentNode;
}
}

base.LoadInput(obj);
}
}

使用 CryptoConfig.AddAlgorithm 方法注册类。

CryptoConfig.AddAlgorithm(typeof(MyXmlDsigC14NTransform), "http://www.w3.org/TR/2001/REC-xml-c14n-20010315"); 

var message = new XmlDocument();
message.PreserveWhitespace = true;
message.Load("XmlSig.xml");

MyXmlDsigC14NTransform.document = message; // The transform class needs the xml document

// Validate signature as normal.

应该这样做。

关于c# - SignedXml.CheckSignature 在 .NET 4 中失败,但在 .NET 3.5、3 或 2 中有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13632630/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com