使(虚拟)智能卡可用于系统服务

使(虚拟)智能卡可用于系统服务

我有一台运行 Windows Server 2019 Datacenter Core 的虚拟机,该虚拟机以非交互式服务的形式运行 Jenkins 构建代理,并具有自己的本地用户帐户(.\build)。

现在我想添加代码签名。为了至少具有一定的安全性,我想使用基于主机上的加密操作的虚拟智能卡,因此想要复制密钥材料的攻击者需要突破虚拟机。

我已经配置了一个虚拟 USB CCID 读卡器,其中永久插入了一张卡,并且它在 Windows 中显示出来:

PS> Get-PnpDevice
...
Error      SmartCardReader Microsoft Usbccid Smartcard Reader (WUDF)                                        USB\VID_08E6...
...

首先,Error情况令人担忧。我已经申请了此修复,这似乎使情况有所改善(卡在启动后立即出现OK),但这似乎不是永久性的。

然而,真正让我困惑的问题是智能卡访问的安全模型。我能找到的大多数文档都涉及使用智能卡进行登录,其策略很简单:登录 UI 可以访问智能卡以验证凭据,然后将此访问权限传递给用户会话。

但是,就我而言,我有一个与桌面不关联的非交互式登录。当我手动启动SCardSvrScDeviceEnum服务时,即使以管理员身份通过 SSH 登录,我也无法访问该卡:

The Microsoft Smart Card Resource Manager is not running.
SCardAccessStartedEvent: Service is in an unknown state.
CertUtil: -SCInfo command FAILED: 0x80070005 (WIN32: 5 ERROR_ACCESS_DENIED)
CertUtil: Access is denied.

这是有道理的,从本地控制台,作为管理员,我得到

PS> certutil -scinfo
The Microsoft Smart Card Resource Manager is running.
Current reader/card status:
SCardEstablishContext: The Smart Card Resource Manager is not running. 0x8010001d (-2146435043 SCARD_E_NO_SERVICE)
SCardEstablishContext failed for user scope.

这两项服务也会在两分钟后自行终止。

问题:

  • 我如何验证模拟智能卡是否已插入并可能列出其中包含的证书?
  • 我如何授予用户访问智能卡的权限(certutil -scinfo可能会显示这一点)?
  • 如何将智能卡上已存在的证书导入本地用户的密钥存储?我需要原始 P7 证书吗,还是可以从卡本身提取?
  • 我是否需要采取任何措施来保持服务持续运行,或者解决访问问题是否也能让它按需启动?

答案1

我想我可能有一个解决方案:Windows 似乎在 Windows Server 上选择了错误的设备驱动程序。在 Windows Server 上,设备显示为“Microsoft Usbccid Smartcard Reader(UMDF2)”,而在桌面 Windows 上则显示为“Microsoft Usbccid Smartcard Reader (妇女发展基金会)”

我不知道为什么会发生这种情况,但以下方法对我有用:

  1. 打开设备管理器
  2. 右键单击显示问题的智能卡读卡器设备->更新驱动程序
  3. 浏览我的电脑以查找驱动程序
  4. 让我从计算机上可用的驱动程序列表中进行选择
  5. 选择 Microsoft Usbccid Smartcard Reader (WUDF) 而不是 UMDF2 版本。
  6. 点击下一步完成驱动程序更改

有点烦人的是,如果你将设备插入不同的 USB 端口,那么你必须再次执行相同的操作。

因此,如果有人知道如何使此操作永久生效,我将非常高兴。这可能涉及稍微修改 inf 文件?

  • 对于损坏的 UMDF2 驱动程序,它使用这个 inf 文件:C:\Windows\System32\DriverStore\FileRepository\usbcciddriver.inf_amd64_d3361c9b119e0de8
  • 对于工作中的 WUDF 驱动程序,它使用C:\Windows\System32\DriverStore\FileRepository\wudfusbcciddriver.inf_amd64_a32870cf151b98c5

(文件名的哈希部分可能因 Windows 版本的不同而略有不同)

相关内容