我正在编写一个Powershell脚本,用于创建自签名证书,这些证书可以作为管理员使用,但作为管理员失败:
调用Create方法时失败的代码:
$PrivateKey = New-Object -ComObject X509Enrollment.CX509PrivateKey
$PrivateKey.ProviderName = "Microsoft RSA SChannel Cryptographic Provider"
$PrivateKey.KeySpec = 0x1
$PrivateKey.Length = 2048
# set security descriptor
$PrivateKey.SecurityDescriptor = "D:PAI(A;;0xd01f01ff;;;SY)(A;;0xd01f01ff;;;BA)(A;;0x80120089;;;NS)"
# key will be stored in local machine certificate store
$PrivateKey.MachineContext = 0x1
# export will be allowed
$PrivateKey.ExportPolicy = 0x1
$PrivateKey.Create()
它抛出了这个错误:
Exception calling "Create" with "0" argument(s): "CertEnroll::CX509PrivateKey::Create: Access is denied. 0x80070005
(WIN32: 5)"
At C:\dev\LinoaSSC.ps1:106 char:1
+ $PrivateKey.Create()
+ ~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : ComMethodTargetInvocation
我应该如何解决或解决此错误?谢谢你们!
答案 0 :(得分:1)
您需要成为本地计算机的管理员才能执行此操作,并且我相信大多数操作都带有证书。我不知道有任何可接受的方法来解决这个问题,但有一些方法可以提升你的权限。
答案 1 :(得分:-1)
您绝对可以允许非管理员创建计算机密钥集。您只需要允许您想要创建私钥的帐户就可以对以下默认目录具有写权限。
C:\ProgramData\Microsoft\Crypto\Keys
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\SystemCertificates
C:\ProgramData\Microsoft\Crypto\RSA
然后,在您的代码中,在调用SecurityDescriptor
方法之前,在CX509PrivateKey
对象上提供Create
。默认SD为"D:P(A;;0xd01f01ff;;;CO)(A;;0xd01f01ff;;;SY)(A;;0xd01f01ff;;;BA)"
,但只需添加帐户SID的条目即可。
奇怪的是,SecuityDescriptor确实允许使用“ CO”,这意味着CreatorOwner,但是对于CNG证书,私钥是由以SYSTEM身份运行的lsass.exe创建的,它模拟了请求证书的帐户。默认情况下,这不允许出于某种原因请求证书的帐户。看来,对于CryptoAPI证书,CreatorOwner SecurityDescriptor确实允许具有默认SecurityDescriptor的请求帐户。
注意:请仔细考虑对环境的安全影响。这将允许该帐户访问机器存储中的私钥。在我的情况下,与授予帐户完全管理员特权相比,最小特权主体是更好的折衷方案。