我正在尝试使用Capicom API和MSXML5 API在Windows Server 2008或2012下运行的服务应用程序中使用存储在智能卡中的证书对XML进行签名。当我在Windows 8中进行测试时,它可以正常工作或作为应用程序,但作为服务失败,错误Keyset未定义。
失败的方法是来自createKeyFromCSP
的{{1}}界面的IXMLDigitalSignature
。
到目前为止我尝试了一些观点:
通过WTS和服务器机器尝试使用智能卡。两种情况均失败。
检查智能卡读卡器的驱动程序和功能。我认为这里没有问题,因为它正如我所说的那样适用于应用程序。
将MSXML5.DLL
商店开放标记CAPICOM
更改为CAPICOM_CURRENT_USER_STORE
。它失败,即使在CAPICOM_SMART_CARD_USER_STORE
的服务属性中通知当前用户凭据,也找不到任何证书。
以本地系统启动服务,并使用services.msc
标志模拟当前用户。也失败了。
通过使用ACL API和LOGON32_LOGON_INTERACTIVE
(https://blogs.msdn.microsoft.com/alejacma/2011/05/19/scardestablishcontext-fails-with-scard_e_no_service-error/)授予事件Global\Microsoft Smart Card Resource Manager Started
权限。失败。
在证书管理器控制台中查找私钥的权限,但由于证书的私钥位于智能卡内,我找不到任何为特定用户设置权限的选项。
为AddAceToObjectsSecurityDescriptor
下的文件夹的所有用户授予权限(Administrador是当前用户)。失败。
使用WinDbg调试器进行调试,我发现问题出在上述方法C:\Users\Administrador\AppData\Roaming\Microsoft\Crypto
中。它在内部调用一个名为createKeyFromCSP
的CryptoAPI方法,并且此方法无法返回所述错误(CryptAcquireContext
或未定义Keyset)。
从我的搜索中,我认为它应该是从Windows Server 2008实现的一些权限问题,但是我找不到任何可能导致此问题的事情。有谁知道可能导致此错误的原因,以及是否可以在系统中执行某些配置来解决此错误?
PS:我正在使用delphi,因此该解决方案无法使用任何.NET解决方案。但是,它可以通过一些WinAPI来实现。