如何在Web应用程序中使用USB令牌签名PDF?

时间:2016-09-28 05:45:11

标签: c# asp.net pdf itext

我想在用户使用USB令牌上传文件时签名PDF,该令牌位于asp.net Web应用程序的客户端计算机中。

我之前关注的是SO Sign PDF with iTextSharp 5.3.3 and USB token

效果很好,当我在本地发布到Web服务器时,它提供了当前会话不是交互式的例外。

堆栈追踪:

  

[InvalidOperationException:当前会话不是交互式的。]

     

System.Security.Cryptography.CAPI.CryptUIDlgSelectCertificateW(CRYPTUI_SELECTCERTIFICATE_STRUCTW   csc)+345679
  System.Security.Cryptography.X509Certificates.X509Certificate2UI.SelectFromStore(SafeCertStoreHandle   safeSourceStoreHandle,String title,String message,X509SelectionFlag   selectionFlags,IntPtr hwndParent)+314
  System.Security.Cryptography.X509Certificates.X509Certificate2UI.SelectFromCollectionHelper(X509Certificate2Collection   证书,字符串标题,字符串消息,X509SelectionFlag   selectionFlag,IntPtr hwndParent)+176
  System.Security.Cryptography.X509Certificates.X509Certificate2UI.SelectFromCollection(X509Certificate2Collection   证书,字符串标题,字符串消息,X509SelectionFlag   selectionFlag)+17 test.WebForm1.Upload_Click(Object sender,   EventArgs e)在E:\ manishtest \ test \ test \ WebForm1.aspx.cs:74
  System.Web.UI.WebControls.Button.OnClick(EventArgs e)+138
  System.Web.UI.WebControls.Button.RaisePostBackEvent(字符串   eventArgument)+150 System.Web.UI.Page.ProcessRequestMain(布尔值   includeStagesBeforeAsyncPoint,Boolean includeStagesAfterAsyncPoint)   6047

我第一次做PDF的数字签名。请建议在上传时在Web应用程序中签署PDF的方式是什么。

1 个答案:

答案 0 :(得分:2)

似乎这一行造成了问题:

System.Security.Cryptography.X509Certificates.X509Certificate2UI.SelectFromCollectionHelper(X509Certificate2Collection certificates, String title, String message, X509SelectionFlag selectionFlag, IntPtr hwndParent)

shows UI选择证书。因此,您需要找到另一种方法来获取证书才能使其正常运行。

您可以尝试使用相关引用的the code in an answer来使用证书文件而不是文件来选择证书。

X509Certificate2 cert = new X509Certificate2("C:\\mycert.p12");

编辑:正如@Bruno Lowagie所评论的那样,通过USB记忆棒进行签名意味着它由棒上的软件完成,而不是在任何地方发送私钥。他的第二条评论更详细地阐述了如何实现这一目标。但是得到这个错误仍然是一样的。在服务器上运行的代码无法打开对话框以在客户端系统上选择证书。