使用来自Windows服务的Microsoft CryptoAPI进行数字签名?

时间:2015-10-07 12:45:21

标签: .net windows-services digital-signature smartcard cryptoapi

是否可以通过Windows服务进行数字签名? 从控制台应用程序起作用的相同代码不适用于Windows服务

当我尝试进行数字签名时,我得到了以下错误:

  

System.InvalidOperationException:当前会话不是   互动。在   System.Security.Cryptography.CAPI.CryptUIDlgSelectCertificateW(CRYPTUI_SELECTCERTIFICATE_STRUCTW   csc)at   System.Security.Cryptography.X509Certificates.X509Certificate2UI.SelectFromStore(SafeCertStoreHandle   safeSourceStoreHandle,String title,String message,X509SelectionFlag   selectionFlags,IntPtr hwndParent)at   System.Security.Cryptography.X509Certificates.X509Certificate2UI.SelectFromCollectionHelper(X509Certificate2Collection   证书,字符串标题,字符串消息,X509SelectionFlag   selectionFlag,IntPtr hwndParent)at   System.Security.Cryptography.X509Certificates.X509Certificate2UI.SelectFromCollection(X509Certificate2Collection   证书,字符串标题,字符串消息,X509SelectionFlag   selectionFlag)

似乎Windows Service无法调用提供要选择的证书列表或PIN窗口的GUI? 服务作为LocalSystem运行,即Admin。我还在app.manifest中添加了以下设置:

<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

是否可以使用win服务来实现此功能?

2 个答案:

答案 0 :(得分:1)

您可能希望启用交互式服务检测(服务名称为UI0Detect)。

Interactive Services Detection

此服务将使您能够在特殊会话0中打开对话框窗口。它可以在Vista中运行。将弹出一个窗口,通知您(当前登录用户)服务需要桌面交互(即输入PIN以访问私钥)。

您可以阅读有关会话0和交互式服务检测here

的更多信息

答案 1 :(得分:0)

您正在使用的方法会弹出一个对话框,允许您查看和选择要使用的证书。服务通常不具有用户界面(因为它们在交互式用户会话之外运行)。我相信你可以提供互动服务,但在这种情况下我不会推荐它。使用另一种选择证书的方式,可能基于所需证书的指纹,例如How to get X509Certificate from certificate store and generate xml signature data?