通过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 ....
}
有人可以为此提供帮助吗?
答案 0 :(得分:1)
是的,提交给服务器的客户证书是客户是他声称的人(sorta)的证明,而且它只包含公钥。
要签名,您需要拥有私钥,只有客户端才能拥有。 如果您想代表客户签署文档,则需要 客户端,或者至少拥有他的私钥。
X509Store位于服务器上,通常包含包含私钥的服务器证书,因此服务器可以向其他人证明他是他声称的人。
这是一个过于简化的解释,并且在我看来不够准确,不能被认为是一个好的 - 所以我真的恳请你更多地了解PKI和证书。我写了一篇post试图给初学者一个很好的背景。
答案 1 :(得分:1)
在发出Web请求时,客户端可以选择发送证书来证明其身份。这就是Request.ClientCertificste。它可能永远不会包含私钥部分,因为任何人都可以将自己作为证书所代表的实体传递出去。那真是太糟糕了。
商店是证书的服务器机器商店。有些只有公钥,并且是计算机信任的身份列表。其他由计算机或其用户在本地创建,以证明它们实际上是他们声称的计算机或用户。他们将拥有私钥和公钥。其他人使用公钥来验证是您或您的计算机实际发送了什么。私钥应该保密,因为您使用它来签名或加密数据。在这里阅读更多http://www.entrust.com/what-is-pki/