CryptoKeySecurity返回null

时间:2018-09-07 14:12:40

标签: .net powershell ssl

我正在尝试使用以下代码修改特定$cert的访问规则:

$csp = New-Object System.Security.Cryptography.CspParameters (
    $cert.PrivateKey.CspKeyContainerInfo.ProviderType, 
    $cert.PrivateKey.CspKeyContainerInfo.ProviderName, 
    $cert.PrivateKey.CspKeyContainerInfo.KeyContainerName)

$csp.Flags = [System.Security.Cryptography.CspProviderFlags]::UseExistingKey -bor [System.Security.Cryptography.CspProviderFlags]::UseMachineKeyStore
$csp.CryptoKeySecurity = $cert.PrivateKey.CspKeyContainerInfo.CryptoKeySecurity
$csp.KeyNumber = $cert.PrivateKey.CspKeyContainerInfo.KeyNumber

$access = New-Object System.Security.AccessControl.CryptoKeyAccessRule (
    $identity, 
    [System.Security.AccessControl.CryptoKeyRights]::GenericRead, 
    [System.Security.AccessControl.AccessControlType]::Allow)

$csp.CryptoKeySecurity.AddAccessRule($access)

但是它在最后一行抛出异常,因为$csp.CryptoKeySecurity为空。调试时发现$cert.PrivateKey.CspKeyContainerInfo.CryptoKeySecurity也为null。但是,困难的部分是这仅发生在五分之一的机器上,不依赖于OS版本或PS版本,仅发生在我们的生产环境中,为什么...?仅供参考$cert.PrivateKey不为空,$cert.PrivateKey.CspKeyContainerInfo也不为空。

1 个答案:

答案 0 :(得分:0)

最后,问题出在我们生产环境中安全设置的不同配置中。在我的机器上,设置Manage auditing and security log设置为Administrators,而在服务器上,设置却不同,只是我们的OPS人员。在将代码重写为C#之后发现了这一点,这引发了异常,这与PS不同,后者只是默默地返回null。

  

该进程不具有此操作所需的“ SeSecurityPrivilege”特权。

有关如何解决此问题的信息,请参见this SO question