使用PowerShell管理Windows證書

如果您是Windows系統管理員,您可能會被迫使用Windows憑證。在Windows中使用憑證通常是系統管理員必須承擔的額外責任之一。使用Windows憑證管理器作為工具,您可以完成這項任務!

憑證通常很複雜且難以理解,但在本文中,您將有機會發現在Windows中憑證並不可怕!

本文主要介紹在Windows中使用憑證的相關知識。如果您想了解有關憑證的一般工作原理,請參閱本文的伴隨X.509憑證教程文章。

理解憑證存儲

在Windows憑證管理器中,所有憑證都存在於稱為憑證存儲的邏輯存儲位置中。憑證存儲是Windows保存當前安裝的所有憑證的“桶”,而一個憑證可以存在於多個存儲中。

不幸的是,憑證存儲不是最直觀的概念。您將在下面了解如何區分這些存儲並如何與它們一起工作。

每個存儲位置位於Windows註冊表和文件系統中。有關詳細信息,請參考下表。在使用存儲中的憑證時,您正在與邏輯存儲進行交互,而不是直接修改註冊表或文件系統。這種簡單的方式讓您可以使用單個對象,而Windows會處理如何在磁盤上表示該對象的問題。

有時候會看到證書存儲被稱為物理存儲或邏輯存儲。物理存儲指的是實際的文件系統或註冊表位置,其中存儲了註冊表鍵和/或文件。邏輯存儲是對一個或多個物理存儲的動態引用。對於大多數常見的用例,邏輯存儲比物理存儲更容易使用。

Windows將證書存儲在兩個不同的區域中-用戶和計算機上下文。證書放置在這兩個上下文中的其中一個,取決於證書是否應該由單個用戶、多個用戶還是計算機本身使用。在本文的其餘部分,用戶上下文和計算機上下文中的證書將非正式地稱為用戶證書和計算機證書。

用戶證書

如果您希望證書被單個用戶使用,那麼Windows證書管理器中的用戶證書存儲是理想的。這是基於證書的身份驗證過程(例如有線IEEE 802.1x)的常見用例。

用戶證書位於當前用戶的配置文件中,並且只在該用戶的上下文中進行邏輯映射。用戶證書是“映射”的,即使在同一個系統上,每個用戶也是獨一無二的。

計算機證書

如果一個證書將被所有使用者在一台電腦或系統進程上使用,它應該被放置在電腦上下文的存儲中。例如,如果一個證書將用於網頁伺服器為所有客戶端加密通信,將證書放置在電腦上下文的存儲中是理想的。

您將看到電腦的證書存儲在所有使用者上下文中具有邏輯映射。這使得電腦證書存儲中的證書可以被所有使用者使用,取決於配置的私鑰權限。

有關私鑰的更多信息,請查看文章X.509證書教程:系統管理員指南。

電腦證書位於本機機器註冊表中的機器散列和程式資料資料夾中。使用者證書位於當前使用者註冊表中的使用者散列和應用程式資料資料夾中。下面您可以看到每種存儲類型在註冊表和檔案系統中的位置。

Context Registry Path Explanation
User HKCU:\SOFTWARE\Microsoft\SystemCertificates\ Physical store for user-specific public keys
User HKCU:\SOFTWARE\Policies\Microsoft\SystemCertificates\ Physical store for user-specific public keys installed by Active Directory (AD) Group Policy Objects (GPOs)
Computer HKLM:\SOFTWARE\Microsoft\SystemCertificates\ Physical store for machine-wide public keys
Computer HKLM:\SOFTWARE\Microsoft\Cryptography\Services\ Physical store for keys associated with a specific service
Computer HKLM:\SOFTWARE\Policies\Microsoft\SystemCertificates\ Physical store for machine-wide public keys installed by GPOs
Computer HKLM:\SOFTWARE\Microsoft\EnterpriseCertificates\ Physical store for machine-wide public keys installed by the Enterprise PKI Containers within an AD domain
Context File Location Explanation
User $env:APPDATA\Microsoft\SystemCertificates\ Physical store for user-specific public keys and pointers to private keys
User $env:APPDATA\Microsoft\Crypto\ Physical store for user-specific private key containers
Computer $env:ProgramData\Microsoft\Crypto\ Physical store for machine-wide private key containers

先決條件

在本文的其餘部分中,您將找到多個示例,展示與Windows證書存儲的互動。為了複製這些示例,請確保您符合以下先決條件:

  • Windows Vista、Windows Server 2008或更新的操作系統。示例使用的是Windows 10企業版1903。
  • 熟悉PowerShell。雖然不是必需的,但這將是用於適當引用證書的語言。示例都是使用Windows PowerShell 5.1創建的。
  • 您不需要安裝任何特定的證書來跟隨操作,但使用自簽名證書是有益的。

在Windows中管理證書

在Windows中,有三種主要的管理證書的方法:

  • 證書Microsoft Management Console(MMC)插件(certmgr.msc
  • PowerShell
  • certutil命令行工具

在本文中,您將學習如何通過證書MMC插件和PowerShell來管理證書。如果您想了解更多關於如何使用certutil的信息,請參閱Microsoft Docs

PowerShell與Windows安全證書管理器比較

由於在Windows中可以以幾種不同的方式管理證書,您應該選擇哪一種?應該使用GUI(MMC)還是使用PowerShell的命令行方式?

注意:本文適用於Windows 7證書管理器和Windows 10證書管理器MMC插件。

首先,考慮一下證書的生命周期。如果您只打算安裝或刪除一個證書,可以考慮使用MMC。但如果您需要管理多個證書或發現自己反覆執行相同的任務,則可以選擇命令行方式。即使您不知道如何編寫PowerShell腳本,如果您需要管理多個不同的證書,學習它也是值得的。

首先讓我們看一下如何使用憑證管理員和 PowerShell 在 Windows 上發現安裝的憑證。

使用 Windows 憑證管理員 (certmgr.msc)

要使用 MMC 檢視憑證,打開憑證管理員,打開開始菜單,然後輸入 certmgr.msc。這將打開 Windows 憑證 MMC。此初始視圖將提供左窗口中顯示的所有邏輯存儲的概述。

您可以在下面的屏幕截圖中看到選中的 受信任的根憑證授權機構 邏輯存儲。

Trusted Root Certification Authorities store

查看物理存儲

默認情況下,Windows 憑證管理員將不顯示實際的物理存儲。要顯示存儲,請點擊 檢視,然後點擊 選項。然後,您將看到選擇顯示物理憑證存儲的選項。啟用此選項可以更容易地識別 Windows 內的特定路徑。

Figure 2 – The Certificates MMC View Options with Physical certificate stores selected.

現在,您可以在之前顯示的示例 受信任的根憑證授權機構 邏輯存儲下看到其他容器。憑證仍然按照其邏輯存儲分組,但現在您可以看到物理存儲 “Registry”。

Inspecting the physical cert stores

檢查 Windows 憑證管理員中的屬性

在使用 MMC 查看憑證時,您可以看到許多憑證的屬性。例如,您可能想選擇特定的憑證。

您可以通過參考證書的“序列號”或“Thumbprint”擴展值來輕鬆完成此操作。如果證書是由證書授權機構(CA)簽署的,則在發行時會有一個序列號。Thumbprint則是在每次查看證書時計算。

您可以通過在MMC中打開證書來查看一些證書的屬性,如下所示。

Inspecting a Windows certificate

需要指出的一個重要特點是嵌入的私鑰。Windows中的證書也可以有相應的私鑰。這些私鑰以加密文件的形式存儲在相應的物理存儲中。

要快速區分具有和不具有相應私鑰的證書,請查看證書圖標。在Windows證書管理器中,如果圖標只是看起來像一張帶有絲帶的紙,則沒有相應的私鑰。如果證書有私鑰,您將在MMC圖標中看到一把鑰匙,並且在打開證書時在“常規”選項卡底部將看到一把鑰匙。

Certificate without an embedded private key

使用PowerShell

與MMC一樣,您也可以使用PowerShell查看和管理證書。首先讓我們檢查物理存儲中的證書(註冊表和文件系統)。

按物理存儲

使用“Get-ChildItem”PowerShell命令,您可以枚舉位於父級註冊表鍵路徑“HKCU:\Software\Microsoft\SystemCertificates\CA\Certificates\”內的所有鍵和值。

下面的命令將列舉目前已登入使用者的Intermediate Certification Authorities邏輯存儲中的所有憑證。

Get-ChildItem -Path HKCU:\Software\Microsoft\SystemCertificates\CA\Certificates\

您在註冊表中看到的每個項目都對應於受信任 CA 的憑證的指紋以及相應屬性中的憑證。您可以在下面的示例輸出中看到這個例子。

Results of the installed certificates from the example commands, limited to the first 5 entries.

另一個常見的存儲位置是個人存儲。該存儲的憑證位於文件系統中,而不是註冊表中。在以下命令中,我們將顯示這些不同的物理路徑及其用途。

命令返回的目錄中的每個文件對應於安裝在個人當前使用者存儲中的憑證。

Get-ChildItem -Path $env:APPDATA\Microsoft\SystemCertificates\My\Certificates\

以下命令返回的每個文件都是由Key Storage Provider (KSP)創建的私鑰對象的引用。文件名對應於憑證的Subject Key Identifier。您安裝的每個私鑰都會添加對應的文件。

Get-ChildItem -Path $env:APPDATA\Microsoft\SystemCertificates\My\Keys\

以下命令返回的目錄中的每個文件都是由 KSP 創建的加密私鑰的唯一容器。文件名與憑證之間沒有直接關聯,但該文件是早期命令中指針的目標。

Get-ChildItem -Path $env:APPDATA\Microsoft\Crypto\Keys

根據邏輯存儲位置

由於在物理路徑中使用憑證並不常見,因此在其餘的示例中,您將使用邏輯存儲區進行操作。

PowerShell可以使用Cert: PSDrive來訪問Windows的邏輯存儲區。 Cert: PSDrive將憑證映射到物理存儲區,就像MMC一樣。

不幸的是,MMC和Cert PSDrive並不以相同的方式標記邏輯存儲區。下面是MMC和Cert PSDrive中常見存儲區及其名稱的比較表。

Cert: Certificates MMC
My Personal
Remote Desktop Remote Desktop
Root Trusted Root Certification Authorities
CA Intermediate Certification Authorities
AuthRoot Third-Party Root Certification Authorities
TrustedPublisher Trusted Publishers
Trust Enterprise Trust
UserDS Active Directory User Object
選擇憑證

當您使用憑證時,您需要一種方法來過濾和選擇要執行特定操作的憑證。大多數情況下,您將根據特定擴展的值來過濾和選擇憑證。

對於以下示例,您需要首先列出根CA存儲中安裝的所有憑證。

Get-ChildItem -Path Cert:\CurrentUser\Root\

返回的對象將是您可以在以下示例中使用的憑證對象。

常見的擴展已經作為憑證對象的屬性可用。在下面的示例中,您使用Get-Member列出返回對象的所有屬性。

Get-ChildItem -Path Cert:\CurrentUser\Root\ | Get-Member -MemberType Properties
Figure 9 – The properties available for the returned certificate objects.

正如您在圖9中看到的,這些擴展中的一些(例如Issuer)對於查找您要查找的憑證很有幫助。擴展提供有關憑證的信息,例如發行對象、可用於何用途以及任何限制。

在更复杂的用例中,您将希望按其他扩展名查找证书,比如使用的证书模板。困难之处在于这些扩展的值返回为整数数组。这些整数对应于ASN.1编码的内容。

对象上现有的ScriptProperties提供了与这些接口交互的示例。在下面的命令中,您将手动提取密钥用法以查看此关系。

((Get-ChildItem -Path Cert:\CurrentUser\Root\ | select -First 1).Extensions | Where-Object {$_.Oid.FriendlyName -eq "Key Usage"}).format($true)

我们在上述命令中引入的新要素是format方法,它执行ASN.1解码。您在上面传递给它一个布尔值(例如$true),以标识我们希望返回的对象是单行还是多行。

您将在下面的命令中使用证书中的Thumbprint值。Thumbprint值被设置为PowerShell变量,并用于在下面的命令中选择特定的证书。

$thumb = "cdd4eeae6000ac7f40c3802c171e30148030c072"
Get-ChildItem -Path Cert:\CurrentUser\Root\ | Where-Object {$_.Thumbprint -eq $thumb}

使用PowerShell创建自签名证书

PowerShell可以使用New-SelfSignedCertificate cmdlet创建自签名证书。自签名证书在测试中非常有用,因为它们允许您生成公钥和私钥对而无需使用CA。

现在让我们在当前用户和本地计算机存储中创建自签名证书,以在接下来的示例中使用。

在下面的示例中,PowerShell正在生成公钥和私钥对、自签名证书,并将它们全部安装到适当的证书存储中。

PS51> New-SelfSignedCertificate -Subject 'User-Test' -CertStoreLocation 'Cert:\CurrentUser\My'
PS51> New-SelfSignedCertificate -Subject 'Computer-Test' -CertStoreLocation 'Cert:\LocalMachine\My'

在生產服務中使用自簽名憑證並不被鼓勵,因為所有基於信任的機制都不存在。

匯入/匯出憑證

公鑰加密基於公鑰的廣泛可用性。基於這一原則,您需要標準的方法來有效共享憑證。同樣重要的是保護私鑰的安全。將私鑰存儲在無法訪問的媒體中,或者與災難恢復材料一起存儲是某些私鑰的常見做法。

這兩者都需要將這些加密對象存儲在標準格式中的方法。匯出提供了執行這些對象的存儲並確保它們使用廣泛接受的標準文件格式的功能。匯入允許您將加密對象帶入Windows操作系統。

使用Windows憑證管理員(certmgr.msc

從MMC中匯出憑證相對簡單。要匯出一個不帶私鑰的憑證,點擊MMC中的憑證,點擊所有任務菜單,然後點擊匯出

在匯出過程中,將要求您選擇文件格式,如下所示。最常見的選項是DERBase-64編碼

Figure 10 – Exporting a certificate with no private key or one that is marked as not exportable.

匯出私鑰

要匯出帶有關聯私鑰的憑證,您需要滿足兩個條件:登錄的帳戶必須具有私鑰的權限(僅適用於計算機憑證),並且私鑰需要標記為可匯出。

要验证本地计算机的私钥权限,您可以选择一个带有私钥的证书,在证书管理控制台中选择所有任务,然后选择管理私钥。打开的对话框将显示私钥的访问控制项。

The Basic Security Property Page for the private keys of a certificate with the Subject of ServerName.

当满足这两个或三个前提条件后,您可以选择一个证书,点击所有任务,然后点击导出,就像您只有一个公钥的证书一样。在导出时,您现在应该有选择是,导出私钥的选项,如下所示。

Certificate Export Wizard with exportable private key.

在Windows中导出私钥时,您只能将文件保存为PFX格式。这些文件类型和编码格式在此帖子中有详细介绍。

对于导出向导中显示的其余设置,您可以使用默认值。下表是每个设置的简要说明。

Setting Description
Including all certificates in the certification path if possible Helps with portability of certificate issuers, and includes all pertinent public keys in the PFX
Delete the private key if the export is successful Removes the private key from the file and has few common use cases, but one example is to test access to private keys
Export all extended properties Will include any extensions within the current certificate, these relate to the certificates [specific settings]() for Windows interfaces
Enable certificate privacy Normally only the private key will be encrypted in the exported PFX file, this setting encrypts the entire contents of the PFX file
Group or user names You can use a group or user security principal from Active Directory for encrypting the contents of the PFX file, but a password is the most portable option across legacy systems or computers not joined to the same domain

导入证书

对于所有支持的证书文件类型,导入功能是相同的。唯一的区别是,如果文件包含私钥,您可以选择“将此密钥标记为可导出”,下面将详细介绍。Windows将使用证书导入向导。

Figure 12 – Certificate Import Wizard with a PFX file.

当您使用PFX文件的证书导入向导时,您将需要提供用于加密私钥的密码。以下是导入选项的另一个总结。

Setting Description
Enable strong private key protection Requires a password for each access of a private key, be cautious of newer functions as they will not be supported in all software
Mark this key as exportable You should try to avoid using this setting on any end system, private keys should be treated similarly to storing passwords
Protect private key using [virtualization-based security] The setting provides more security functionality for protecting private keys from advanced malware attacks
Include all extended properties Relates to the same Windows-specific settings discussed as with exporting

PowerShell代碼簽署證書是強私鑰保護的一個很好的應用案例。

自動放置證書可能需要謹慎處理。手動選擇證書存儲區通常會獲得最佳結果。

使用PowerShell

現在,使用PowerShell導出之前創建的自簽名證書之一。在這個例子中使用了當前用戶,但您也可以使用其他選項。

下面,您正在選擇當前用戶個人邏輯存儲區中的一個自簽名證書,這意味著發行者與主題匹配。

$certificate = Get-Item (Get-ChildItem -Path Cert:\CurrentUser\My\ | Where-Object {$_.Subject -eq $_.Issuer}).PSPath

現在,您已經選擇了一個證書,可以使用Export-Certificate命令使用下面的命令保存一個DER編碼文件。

Export-Certificate -FilePath $env:USERPROFILE\Desktop\certificate.cer -Cert $certificate

現在,讓我們來看一下如何導出私鑰。在下面,您正在驗證您選擇的證書是否具有私鑰,如果這不返回true,那麼Get-Item命令可能選擇了錯誤的證書。

$certificate.HasPrivateKey

在下面,您將設置一個用於加密私鑰的密碼。然後導出所選證書到一個PFX文件中,並使用先前輸入的密碼對文件進行加密。

$pfxPassword = "ComplexPassword!" | ConvertTo-SecureString -AsPlainText -Force
Export-PfxCertificate -FilePath $env:USERPROFILE\Desktop\certificate.pfx -Password $pfxPassword -Cert $certificate

與導出類似,有兩個命令。一個用於導入證書,一個用於導入PFX文件。

下面的Import-Certificate命令將之前導出的DER編碼文件導入到當前用戶的個人存儲中。

Import-Certificate -FilePath $env:USERPROFILE\Desktop\certificate.cer -CertStoreLocation Cert:\CurrentUser\My

假設您還想安裝該證書的私鑰。

$pfxPassword = "ComplexPassword!" | ConvertTo-SecureString -AsPlainText -Force
Import-PfxCertificate -Exportable -Password $pfxPassword -CertStoreLocation Cert:\CurrentUser\My -FilePath $env:USERPROFILE\Desktop\certificate.pfx

請記住,密碼需要是Secure String。同樣,如果您將其導入到本地計算機存儲(例如),則需要從提升的管理員提示符中運行該命令。

在上面的示例中,您還使用了命令中的Exportable參數,將私鑰標記為可導出的。默認情況下,私鑰是不可導出的。可導出的私鑰是另一個安全考慮因素,需要進一步關注如何保護它們。

在Windows中還有很多其他與證書相關的操作,因此您應該進一步了解。

使用PowerShell刪除證書

在刪除證書時,請記住沒有回收站。一旦您刪除了證書,它就會消失。這意味着確認您正在刪除正確的證書非常重要,可以通過驗證唯一標識符(例如序列號或指紋擴展值)來確認。

與上面類似,在下面的命令中,我們從當前用戶的個人存儲中選擇了一個自簽名證書。

$certificate = Get-Item (Get-ChildItem -Path Cert:\CurrentUser\My\ | Where-Object {$_.Subject -eq $_.Issuer}).PSPath

下面您可以看到所選證書的指紋、序列號和主題屬性,以確保它是您打算選擇的證書。

$certificate.Thumbprint
$certificate.SerialNumber
$certificate.Subject

請確認您已選擇正確的憑證以供刪除。

下面的指令將刪除所有選定的憑證對象,請謹慎使用。通過將$certificate對象通過管道傳遞給下面的指令中的Remove-Item cmdlet,您將刪除所有憑證內容而無需進行任何驗證提示。

$certificate | Remove-Item

總結

在本文中,您已學習了如何在Windows中訪問憑證以及處理憑證時使用的一些工具。在這個主題上還有很多可以探索的,包括如何將安裝的憑證與特定服務關聯,甚至如何通過部署自己的憑證機構(CA)來實施私有公鑰基礎結構(PKI)。

進一步閱讀

Source:
https://adamtheautomator.com/windows-certificate-manager/