繁体   English   中英

X509Enrollment.CX509PrivateKey 在没有管理员权限的情况下创建

[英]X509Enrollment.CX509PrivateKey Create without Admin rights

我正在编写一个创建自签名证书的 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

我应该如何排除故障或解决此错误? 谢谢你们!

您需要成为本地计算机的管理员才能执行此操作,我相信大多数操作都带有证书。 我不知道有任何可接受的方法来解决这个问题,但有一些方法可以提升您的权限。

您绝对可以允许非管理员创建机器密钥集。 您只需要允许您要创建私钥的帐户对以下默认目录具有写入权限。

C:\ProgramData\Microsoft\Crypto\Keys
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\SystemCertificates
C:\ProgramData\Microsoft\Crypto\RSA

然后,在您的代码中,在调用Create方法之前,在CX509PrivateKey对象上提供一个SecurityDescriptor 默认 SD 是"D:P(A;;0xd01f01ff;;;CO)(A;;0xd01f01ff;;;SY)(A;;0xd01f01ff;;;BA)" ,但只需为帐户 SID 添加一个条目。

奇怪的是,SecuityDescriptor 确实允许“CO”,这意味着 CreatorOwner,但对于 CNG 证书,私钥由以 SYSTEM 身份运行的 lsass.exe 创建,它模拟请求证书的帐户。 默认情况下,这不允许出于某种原因请求证书的帐户。 看起来,对于 CryptoAPI 证书,CreatorOwner SecurityDescriptor 确实允许使用默认 SecurityDescriptor 的请求帐户。

注意:仔细考虑对您的环境的安全影响。 这将允许帐户访问机器存储中的私钥。 在我的场景中,与授予帐户完全管理员权限相比,最小特权主体是更好的权衡。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM