异常 "No Private Key" - X509Store 与 Request.ClientCertificate?

Exception "No Private Key" - X509Store vs. Request.ClientCertificate?

通过 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 的证书上执行相同的代码,我总是收到异常 "No Private Key"。

这是两种情况下使用的代码:

 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 ....
 }

有人可以帮忙吗?

是的,提供给服务器的客户端证书证明客户端是他声称的身份(有点),并且只包含 public 密钥。

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

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

这是一个过于简化的解释,在我看来还不够准确,不能算是一个好的解释 - 所以我真的强烈建议您了解更多关于 PKI 和证书的信息。我写了一个 post 试图给初学者一个很好的背景。

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

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