IX509PrivateKey :: Create在被称为"网络服务"

时间:2012-06-27 21:51:33

标签: winapi cryptography cryptoapi x509

我正在使用IX509PrivateKey为X.509证书请求创建密钥(作为“NT AUTHORITY \ NETWORK SERVICE”),并且Create方法正在生成拒绝访问(我是P /调用发送来自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。

1 个答案:

答案 0 :(得分:1)

此问题的原因已经确定。

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

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