我的公司有一个网络文档管理应用程序,我被指派寻找一种使用用户数字证书签署 pdf 文件的方法。
pdf 可以从几 kb 到超过 100Mb,这是通过 Internet 进行的,因此必须在 Web 服务器上进行签名。
为此,我构建了一个 activeX 控件,要求用户选择证书,然后使用 WebClient.UploadData 将证书作为字节数组发送到网页。
在网页上,当我尝试签署 pdf 文档时,我收到错误“密钥不存在”。这对我来说并不奇怪,因为当我在选择正确的证书后直接通过 https 连接使用证书时,我会提示输入密钥。activeX 不会发生这种情况。
这就是我从用户那里获得证书的方式:
private static X509Certificate2 PickCertificate()
{
X509Store store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
try
{
store.Open(OpenFlags.ReadOnly);
// pick a certificate from the store
X509Certificate2 cert = X509Certificate2UI.SelectFromCollection(store.Certificates, "Title", "Message", X509SelectionFlag.SingleSelection)[0];
// show certificate details dialog
X509Certificate2UI.DisplayCertificate(cert);
store.Close();
return cert;
}
finally { store.Close(); }
}
如何要求用户提供我缺少的密钥?