例外情况“没有私钥” - X509Store与Request.ClientCertificate?

时间:2015-07-30 20:55:46

标签: asp.net x509certificate

通过X509Store与Request.ClientCertificate选择证书有什么区别?

我可以使用X509Store选择的证书签署PDF。

 X509Store store = new X509Store(StoreLocation.CurrentUser);
 store.Open(OpenFlags.ReadOnly);
 X509CertificateCollection certificates = X509Certificate2UI.SelectFromCollection(store.Certificates,
                                                                                        "Certificate Connections",
                                                                                        "Please select a certificate to sign with",
                                                                                        X509SelectionFlag.SingleSelection);
 store.Close();

 X509Certificate2 cert = null;

 if (certificates.Count != 0)
 {
      cert = (X509Certificate2)certificates[0];
      Org.BouncyCastle.X509.X509CertificateParser cp = new Org.BouncyCastle.X509.X509CertificateParser();
      Org.BouncyCastle.X509.X509Certificate[] chain = new Org.BouncyCastle.X509.X509Certificate[] { cp.ReadCertificate(cert.RawData) };
      IExternalSignature externalSignature = new X509Certificate2Signature(cert, "SHA-1");
     // .... REST OF CODE ....
 }

但是,我无法在Request.ClientCertificate的证书上执行相同的代码,我总是收到异常“没有私钥”。

以下是两个实例中使用的代码:

 X509Certificate2 cert = new X509Certificate2(Page.Request.ClientCertificate.Certificate);

 if (Request.ClientCertificate.IsValid || Request.ClientCertificate.Count > 0)
 {         
      Org.BouncyCastle.X509.X509CertificateParser cp = new Org.BouncyCastle.X509.X509CertificateParser();
      Org.BouncyCastle.X509.X509Certificate[] chain = new Org.BouncyCastle.X509.X509Certificate[] { cp.ReadCertificate(cert.RawData) };
      IExternalSignature externalSignature = new X509Certificate2Signature(cert, "SHA-1");
      // .... EXCEPTION happens on line above ....
      // .... REST OF CODE ....
 }

有人可以为此提供帮助吗?

2 个答案:

答案 0 :(得分:1)

是的,提交给服务器的客户证书是客户是他声称的人(sorta)的证明,而且它只包含公钥。

要签名,您需要拥有私钥,只有客户端才能拥有。 如果您想代表客户签署文档,则需要 客户端,或者至少拥有他的私钥。

X509Store位于服务器上,通常包含包含私钥的服务器证书,因此服务器可以向其他人证明他是他声称的人。

这是一个过于简化的解释,并且在我看来不够准确,不能被认为是一个好的 - 所以我真的恳请你更多地了解PKI和证书。我写了一篇post试图给初学者一个很好的背景。

答案 1 :(得分:1)

在发出Web请求时,客户端可以选择发送证书来证明其身份。这就是Request.ClientCertificste。它可能永远不会包含私钥部分,因为任何人都可以将自己作为证书所代表的实体传递出去。那真是太糟糕了。

商店是证书的服务器机器商店。有些只有公钥,并且是计算机信任的身份列表。其他由计算机或其用户在本地创建,以证明它们实际上是他们声称的计算机或用户。他们将拥有私钥和公钥。其他人使用公钥来验证是您或您的计算机实际发送了什么。私钥应该保密,因为您使用它来签名或加密数据。在这里阅读更多http://www.entrust.com/what-is-pki/