验证.NET中的XMLDSIG链?

时间:2012-02-06 14:42:16

标签: .net x509 xml-dsig

我正在使用XMLDSIG到sign a configuration file。我希望我的CA能够发布可用于签署XML的密钥。然后,我想验证XML是否已使用我的CA颁发的密钥进行签名。

如何从SignedXml对象中获取签名证书?如何将证书链追溯到特定CA?

请注意,我的CA的公钥将存储在我的可执行文件中,而不是存储在证书存储区中。

1 个答案:

答案 0 :(得分:2)

要将任意证书附加到XML-DSIG文件,请添加<X509Data> element。要在.NET中执行此操作,请使用:

signedXml.KeyInfo.AddClause(
    new KeyInfoX509Data(certificate, X509IncludeOption.WholeChain));

要从XML文件中提取证书,请使用:

var certificates = signedXml.KeyInfo.OfType<KeyInfoX509Data>().Single();

然后,您可以使用以下内容验证链:

var chain = new X509Chain();
chain.ChainPolicy.ExtraStore.AddRange(
    certificates.Cast<X509Certificate2>().ToArray());
var chainIsOk = chain.Build(signingCertificate);

要确定哪个证书实际用于签名(以及signingCertificate的值),您需要找到matches the keyCheckSignatureReturningKey返回的附带证书。