【问题标题】:X509Certificate and XmlDsigX509Certificate 和 XmlDsig
【发布时间】:2011-04-26 17:27:49
【问题描述】:

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

这是我所做的:

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));

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

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

我错过了什么?

提前致谢

【问题讨论】:

    标签: c# x509certificate signature xml-signature


    【解决方案1】:

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

    【讨论】:

    • 就我而言,我有一个需要将 xml 发送给客户服务的应用程序。我想客户想知道发件人(我)可以被信任(或者可能是其他应用程序)。他们给了我一个 .p7b 用于签署 xml。你认为我需要一个私钥(客户可以与受信任的合作伙伴共享的密钥)还是仅使用公钥可以获得相同的任务?
    • @SkyG 您必须拥有自己的带有私钥的证书,并将此证书(当然没有私钥)提供给客户。如果客户给您它的证书并要求您使用此证书签署您的数据,这可能意味着以下情况之一:(a) 客户不了解 PKI 的工作原理,或 (b) 客户的意思是您需要加密数据(这再次表明客户不具备安全能力)。更多...
    • @SkyG 为了验证您用于签名的证书是否属于您,客户验证该证书。这是一个复杂的过程,在大多数软件中都是自动化的。当您的证书由某些知名证书颁发机构签名时,它可以工作。例如。如果您前往globalsign.com/document-security-compliance/adobe-cds 购买PDF 签名证书,客户的Adobe Reader 将自动正确验证此证书。 XML 也是如此。
    • 谢谢尤金,然后我会开始阅读更多关于 PKI 的内容:)。我想投票给答案,但我仍然没有足够的分数。
    【解决方案2】:

    如果您要为您的内容创建数字签名,您将使用您的私钥对该内容的摘要进行加密,并将您的原始内容和您的签名发送给收件人。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-16
      • 2014-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多