我正在使用SChannel来支持客户端TLS连接的NT服务。证书是通过本地计算机证书管理器(certlm.msc)手动安装到名为“公共集线器接口”的自定义证书存储中的。该服务已经投入生产了几个月,除以下问题外,运行顺利。
尽管在LocalSystem下一切正常,为了最大程度地提高安全性,我尝试使用虚拟服务帐户,例如“ NT Service \ Public Hub Interface”。但是,由于帐户受到严格限制,因此该服务不再有权访问系统的私钥,因此,这导致AcquireCredentialsHandle返回SEC_E_UNKNOWN_CREDENTIALS。我已经尝试通过手动方式和程序方式授予对各种文件和注册表对象的访问权限,如以下链接中所述,但是部分成功-CAPI证书有效,但CNG无效。
https://docs.microsoft.com/en-us/windows/desktop/seccng/key-storage-and-retrieval
https://docs.microsoft.com/en-us/windows/desktop/SecCrypto/modifying-key-container-access
还有其他人,但是他们几乎都说相同的话。此外,许多解决方案都针对单个证书工作,并假定直接访问它们或至少知道其位置。不幸的是,对我而言情况并非如此,因为证书是通过certlm从外部安装的,并且游戏计划中没有单独的自定义证书安装应用。确实,如果可能的话,我对访问容器更感兴趣,而不是处理它们的特定内容。此外,还有许多证书,其中没有一个是事先知道的,大多数证书通常在服务运行后就安装好了。
我宁愿不从本地计算机的商店提供者切换到服务(即当前用户)的商店提供者,尤其是由于我即将发布并且没有时间修改/重新测试已经工作的代码,更不用说重新导入证书以及重新培训操作员的新程序了。因此,我希望有一种简单可靠的方法来为服务授予与LocalSystem帐户相同的对系统私钥的访问权限。
请注意,该服务是通过MSI软件包安装的,该软件包使用不受管理的C ++自定义操作DLL来执行高级操作,例如配置服务恢复选项和创建证书存储;我打算使用相同的DLL来设置安装过程中所需的访问权限。就是说,相对于使用外部程序(例如WinHttpCertCfg.exe或CertUtil.exe)的程序,我更喜欢一种编程解决方案,该程序甚至可能无法在目标系统上运行,或者必须包含在软件包中。还不存在。
非常感谢您的协助。