0

我正在使用 IX509PrivateKey 为 X.509 证书请求创建密钥(作为“NT AUTHORITY\NETWORK SERVICE”),并且 Create 方法正在生成拒绝访问(我正在从 C# 调用/调用调度接口,因此 HRESULT 被转换为 .NET 异常)。进程监视器还显示访问被拒绝尝试访问密钥文件(正在创建密钥文件)。

这是实际的代码:

        IX509PrivateKey privateKey = new CX509PrivateKey() as IX509PrivateKey;
        privateKey.Length = request.KeyLength;
        privateKey.ExportPolicy = X509PrivateKeyExportFlags.XCN_NCRYPT_ALLOW_EXPORT_FLAG;
        privateKey.KeySpec = X509KeySpec.XCN_AT_SIGNATURE;
        privateKey.KeyUsage = X509PrivateKeyUsageFlags.XCN_NCRYPT_ALLOW_ALL_USAGES;
        privateKey.MachineContext = true;
        privateKey.Create();
        return privateKey; 

如果我改为创建用户密钥集(通过将 MachineContext 设置为 false),我会看到“找不到文件”而不是“拒绝访问”。但是 ProcMon 什么也没显示;不尝试访问任何密钥文件。

在 Process Monitor 中,我能够确定“网络服务”无权访问密钥文件,因此我使用 IX509PrivateKey::SecurityDescriptor 属性来设置它。“网络服务”确实可以访问密钥文件,但我仍然收到来自 Create 的访问被拒绝,并且 ProcMon 仍然显示对该文件的访问被拒绝尝试。

很多 TIA 适合任何和所有想法。

4

1 回答 1

1

已确定此问题的原因。

对 IX509PrivateKey::Create 的调用发生在 Web 服务中。结果,它是在假冒IUSR的情况下发生的。我们编辑了启用错误用户的 ACL。结果是直接拒绝访问,仅针对混淆的用户帐户。这种情况可以在 ProcMon 中观察到。ProcMon 的“详细信息”列将清楚地指示(您可能必须启用“高级输出”)调用是在模拟用户帐户下进行的。

为了更严格地控​​制进行调用和访问 CA 的用户帐户,我们将请求移出进程。注册 API 调用现在由它们自己的 Windows 服务进行,并通过 WCF (net.tcp) 公开给在 IIS 中运行的 Web 服务。这将是我对其他人的建议。IMO,在 IIS 内进行调用缺乏控制的风险超过了另一个“移动部分”的风险。

于 2012-07-05T16:20:45.980 回答