簡體   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