首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >X509Certificate和XmlDsig

X509Certificate和XmlDsig
EN

Stack Overflow用户
提问于 2011-04-27 01:27:49
回答 2查看 3K关注 0票数 2

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

以下是我所做的工作:

1)我已在以下位置安装证书:证书-当前用户-受信任的根证书。

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

代码语言:javascript
复制
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)尝试使用证书的公钥创建签名,代码如下;

代码语言:javascript
复制
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));

但在计算签名时,我得到了一个异常:“对象只包含密钥对的公共部分。还必须提供私钥。”

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

我错过了什么?

提前感谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-04-27 01:44:37

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

票数 2
EN

Stack Overflow用户

发布于 2011-05-07 04:43:47

如果您要为您的内容创建数字签名,您将使用您的私钥加密此内容的摘要,并将原始内容+您的签名发送给接受者。

验证阶段:验证者将使用您的公钥对您的签名进行解密,得到哈希H1。然后由H1的接收者对原始内容进行散列。接收方验证H1是否等于H2,如果不是,签名验证失败。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5794107

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档