c# - X509证书和XmlDsig

标签 c# x509certificate signature xml-signature

我需要在 C# (4.0) 中使用 X509Certificate(应验证签名的人提供的 .p7b 文件)对 XML (XMLDSig Envelope) 进行签名 我没有安全方面的经验,我的知识仅限于密码学的一些基本概念。

这是我所做的:

1) 我已将证书安装在:证书 - 当前用户 - 受信任的根证书中。

2) 从.net我成功地使用以下代码加载了证书:

X509Store store = new X509Store(StoreName.Root, StoreLocation.CurrentUser);
try
{
    store.Open(OpenFlags.ReadOnly);
    X509Certificate2Collection certs = store.Certificates.Find(X509FindType.FindBySubjectName, certName, false);
    if (certs.Count == 0)
        return null;

    return certs[0];
}
finally
{
    store.Close();
}

3)我尝试使用证书的公钥通过以下代码创建签名;

XmlDocument doc = new XmlDocument();
doc.PreserveWhitespace = true;
var reader = new StringReader(xml);
doc.Load(reader);
var signedXml = new SignedXml(doc);
X509Certificate2 certificate = this.GetCertificateFromStore(certName); // the previous code
signedXml.SigningKey = (RSACryptoServiceProvider)certificate.PublicKey.Key;
var reference = new Reference();
reference.Uri = "";
XmlDsigEnvelopedSignatureTransform env = new XmlDsigEnvelopedSignatureTransform();
reference.AddTransform(env);
signedXml.AddReference(reference);
signedXml.ComputeSignature(); //  exception!!!
var element = signedXml.GetXml();
doc.AppendChild(doc.ImportNode(element, true));

但是在计算签名时我得到一个异常:“对象仅包含 key 对的公共(public)部分。还必须提供私钥。”

我检查了证书中的属性 HasPrivateKey,它是错误的。 我的(基本)理解是我不应该拥有私钥,我应该能够使用公钥创建签名。

我缺少什么?

提前致谢

最佳答案

.p7b 代表 PKCS#7 格式,通常不包含私钥。当您签署文档时,您可以通过应用私钥来证明其真实性,该私钥属于您并且必须保密。因此,任何人(可能除了您的网络管理员或有时是银行)都不太可能向您提供您的私钥。

关于c# - X509证书和XmlDsig,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5794107/

相关文章:

c# - 像 Jabbr 这样的内容提供商

c# - 为什么除非我将子 CA 证书放入受信任的根证书颁发机构,否则我的证书无效?

perl - 如何在运行时获取子程序的签名?

android - 使用 x.509 android 对 XML 进行签名

c# - 为什么方法不能声明返回类型 `List<IMyInterface>` 并返回实现它的具体类

c# - 程序没有响应,调试显示 'Value cannot be null'

c# - 多播和订阅主题的 react 性框架问题

c# - 在数据库中存储 X509 证书

tomcat - Apache tomcat 相互认证自签名证书 REST 服务

html - 如何使用 MIME 和 CID 嵌入以 HTML 和内联 CSS 编写的电子邮件签名?