(注:IMO的问题主要是关于WinAPI的和DACL,而不是关于CNG,所以请继续阅读!)映射
我目前正试图修改的样品CNG密钥微软的加密提供程序开发工具包的存储提供商以这种方式,它不会而不是将密钥存储在单个文件中。但是,我遇到了可以分配给私钥的安全描述符。
在Windows Server Management Console的证书管理单元中,可以管理证书的私钥,即密钥的所有者,DACL和SACL可以更改,从而导致NCryptSetProperty调用的安全描述符为参数。对于DACL,管理单元仅允许/拒绝“完全控制”或“读取”,这会导致GENERIC_ALL或GENERIC_READ位置于ACE的访问掩码中。
据我所知,这些通用位需要映射到特定于应用程序的权限 - 否则AccessCheck将无法工作。但是我真的需要手工做这个吗?
CreatePrivateObjectSecurity + SetPrivateObjectSecurity并不总是有效,因为CreatePrivateObjectSecurity对输入安全描述符中的所有者和组非常挑剔。而且,当应用映射时,通用位在访问掩码中被清除,导致管理单元显示错误的设置(正如我所说的,管理单元在显示当前权限时仅考虑GA和GR位)。
看来我错过了一些作品在这里...
正如我上面写的:我不把所接收的安全描述符文件或任何其他内核对象,但需要在内部存储它。实际上,我尝试将所有关键数据(公钥和私钥以及属性!)存储在数据库中。因此,只有* PrivateObjectSecurity函数是可能的 - 但不起作用(s.a.)。 – dannyM
仅将GENERIC权限映射到特定权限**也是不正确的,因为当CPGetProvParam/NCryptGetPropertyFn应该返回SD时,我需要再次将其转换回来。原因是Windows Server Management Console **只识别GENERIC权限。似乎这里有一些缺失的功能... – dannyM
@dannyM - 对不起,我错了 - 编辑自我答案。 CP确实需要在'CPGetProvParam'中转换为通用掩码 - 我在编辑的答案中描述了这一点 – RbMm