[英]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.