异常 "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/
通过 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/