Certificate 提供程序

提供程序名称

证书

驱动器

Cert:

功能

ShouldProcess

简短说明

在 PowerShell 中提供对 X.509 证书存储和证书的访问权限。

详细说明

借助 PowerShell 证书 提供程序,可以在 PowerShell 中获取、添加、更改、清除和删除证书和证书存储。

证书驱动器是一个分层命名空间,其中包含计算机上的证书存储和证书。

证书提供程序支持本文中介绍的以下 cmdlet。

此提供程序公开的类型

证书驱动器公开以下类型。

  • 存储位置 (Microsoft.PowerShell.Commands.X509StoreLocation) ,它们是对当前用户和所有用户的证书进行分组的高级容器。 每个系统都具有 CurrentUser 和 LocalMachine(所有用户)存储位置。

  • 证书存储 (System.Security.Cryptography.X509Certificates.X509Store) ,它们是在其中保存和管理证书的物理存储。

  • X.509 System.Security.Cryptography.X509Certificates.X509Certificate2 证书,每个证书都表示计算机上的 X.509 证书。 证书由其指纹标识。

证书提供程序在 PowerShell 中将证书命名空间公开为Cert:驱动器。 此命令使用 Set-Location 命令将当前位置更改为 LocalMachine 存储位置中的根证书存储区。 使用反斜杠 (\) 或正斜杠 (/) 指示驱动器的 Cert: 级别。

Set-Location Cert:

还可以使用任何其他 PowerShell 驱动器中的证书提供程序。 若要从另一个位置引用别名,请在 Cert: 路径中使用驱动器名称。

PS Cert:\> Set-Location -Path LocalMachine\Root

若要返回到文件系统驱动器,请键入驱动器名称。 例如,键入:

Set-Location C:

注意

PowerShell 使用别名使你能够熟悉地使用提供程序路径。 和 lsdir命令现在是 Get-ChildItem 的别名,cdSet-Location 的别名。 和 pwdGet-Location 的别名。

显示证书: 驱动器的内容

此命令使用 Get-ChildItem cmdlet 在 CurrentUser 证书存储位置显示证书存储。

如果不在驱动器中 Cert: ,请使用绝对路径。

PS Cert:\CurrentUser\> Get-ChildItem

显示 Cert: 驱动器中的证书属性

此示例使用 获取证书 Get-Item ,并将其存储在变量中。 该示例演示使用 Select-Object (DnsNameListEnhancedKeyUsageListSendAsTrustedIssuer) 的新证书脚本属性。

$c = Get-Item cert:\LocalMachine\My\52A149D0393CE8A8D4AF0B172ED667A9E3A1F44E
$c | Format-List DnsNameList, EnhancedKeyUsageList, SendAsTrustedIssuer
DnsNameList          : {SERVER01.contoso.com}
EnhancedKeyUsageList : {WiFi-Machine (1.3.6.1.4.1.311.42.2.6),
                       Client Authentication (1.3.6.1.5.5.7.3.2)}
SendAsTrustedIssuer  : False

查找所有 CodeSigning 证书

此命令使用 cmdlet 的 CodeSigningCertRecurse 参数 Get-ChildItem 获取计算机上具有代码签名权限的所有证书。

Get-ChildItem -Path cert: -CodeSigningCert -Recurse

查找过期的证书

此命令使用 cmdlet 的 Get-ChildItemExpiringInDays 参数获取将在未来 30 天内过期的证书。

Get-ChildItem -Path cert:\LocalMachine\WebHosting -ExpiringInDays 30

查找服务器 SSL 证书

此命令使用 cmdlet 的 Get-ChildItemSSLServerAuthentication 参数获取 My 和 WebHosting 存储中的所有服务器 SSL 证书。

Get-ChildItem -Path cert:\LocalMachine\My, cert:\LocalMachine\WebHosting `
  -SSLServerAuthentication

在远程计算机上查找过期的证书

此命令使用 Invoke-Command cmdlet 在 Srv01 和 Srv02 计算机上运行 Get-ChildItem 命令。 ExpiringInDays 参数中的值为零 (0) 获取已过期的 Srv01 和 Srv02 计算机上的证书。

Invoke-Command -ComputerName Srv01, Srv02 {Get-ChildItem -Path cert:\* `
  -Recurse -ExpiringInDays 0}

组合筛选器以查找一组特定的证书

此命令获取 LocalMachine 存储位置中具有以下属性的所有证书:

  • DNS 名称中的“fabrikam”
  • EKU 中的“客户端身份验证”
  • SendAsTrustedIssuer 属性的 值为$true
  • 不要在未来 30 天内过期。

NotAfter 属性存储证书过期日期。

[DateTime] $ValidThrough = (Get-Date) + (New-TimeSpan -Days 30)
Get-ChildItem -Path cert:\* -Recurse -DNSName "*fabrikam*" `
  -EKU "*Client Authentication*" | Where-Object {
                                     $_.SendAsTrustedIssuer -and `
                                     $_.NotAfter -gt $ValidThrough
                                   }

打开证书 MMC 管理单元

Invoke-Item cmdlet 将使用默认应用程序打开指定的路径。 对于证书,默认应用程序是证书 MMC 管理单元。

此命令将打开证书 MMC 管理单元以管理指定的证书。

Invoke-Item cert:\CurrentUser\my\6B8223358119BB08840DEE50FD8AF9EA776CE66B

复制证书

证书提供程序不支持复制 证书 。 尝试复制证书时,会看到此错误。

$path = "Cert:\LocalMachine\Root\E2C0F6662D3C569705B4B31FE2CBF3434094B254"
PS Cert:\LocalMachine\> Copy-Item -Path $path -Destination .\CA\
Copy-Item : Provider operation stopped because the provider does not support
this operation.
At line:1 char:1
+ Copy-Item -Path $path -Destination .\CA\
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotImplemented: (:) [Copy-Item],
                              PSNotSupportedException
    + FullyQualifiedErrorId : NotSupported,
                              Microsoft.PowerShell.Commands.CopyItemCommand

移动证书

将所有 SSL 服务器身份验证证书移动到 WebHosting 存储

此命令使用 Move-Item cmdlet 将证书从“我的存储”移动到 WebHosting 存储。

Move-Item 不会移动证书存储,也不会将证书移动到其他存储位置,例如将证书从 LocalMachine 移动到 CurrentUser。 cmdlet Move-Item 可移动证书,但不移动私钥。

此命令使用 cmdlet 的 Get-ChildItemSSLServerAuthentication 参数获取 MY 证书存储中的 SSL 服务器身份验证证书。

返回的证书通过管道传递到 Move-Item cmdlet,该 cmdlet 会将证书移动到 WebHosting 存储。

Get-ChildItem cert:\LocalMachine\My -SSLServerAuthentication | Move-Item `
  -Destination cert:\LocalMachine\WebHosting

删除证书和私钥

Remove-Item cmdlet 将删除你指定的证书。 动态 -DeleteKey 参数删除私钥。

从 CA 存储中删除证书

此命令从 CA 证书存储中删除证书,但会使相关联的私钥保持不变。

在驱动器中Cert:Remove-Item,cmdlet 仅支持 DeleteKeyPathWhatIfConfirm 参数。 忽略所有其他参数。

Remove-Item cert:\LocalMachine\CA\5DDC44652E62BF9AA1116DC41DE44AB47C87BDD0

使用 DNS 名称中的通配符删除证书

此命令删除具有包含“Fabrikam”的 DNS 名称的所有证书。 它使用 cmdlet 的 Get-ChildItemDNSName 参数获取证书,并使用 Remove-Item cmdlet 将其删除。

Get-ChildItem -Path cert:\LocalMachine -DnsName *Fabrikam* | Remove-Item

从远程计算机中删除私钥

这一系列命令将启用委派,然后在远程计算机上删除该证书和相关联的私钥。 若要删除远程计算机上的私钥,你必须使用委派的凭据。

Enable-WSManCredSSP使用 cmdlet 在 S1 远程计算机上的客户端上启用凭据安全服务提供程序 (CredSSP) 身份验证。 CredSSP 允许使用委派的身份验证。

Enable-WSManCredSSP -Role Client -DelegateComputer S1

使用 Connect-WSMan cmdlet 将 S1 计算机连接到本地计算机上的 WinRM 服务。 此命令完成后,S1 计算机将显示在 PowerShell 的本地 WSMan: 驱动器中。

Connect-WSMan -ComputerName S1 -Credential Domain01\Admin01

现在,可以使用 WSMan: 驱动器中的 Set-Item cmdlet 为 WinRM 服务启用 CredSSP 属性。

Set-Item -Path WSMan:\S1\Service\Auth\CredSSP -Value $true

使用 New-PSSession cmdlet 在 s1 计算机上启动远程会话,并指定 CredSSP 身份验证。 将会话保存在 变量中 $s

$s  = New-PSSession S1 -Authentication CredSSP -Credential Domain01\Admin01

最后,使用 Invoke-Command cmdlet 在 变量的会话中$s运行Remove-Item命令。 该 Remove-Item 命令使用 DeleteKey 参数删除私钥以及指定的证书。

Invoke-Command -Session $s { Remove-Item `
  -Path cert:\LocalMachine\My\D2D38EBA60CAA1C12055A2E1C83B15AD450110C2 `
  -DeleteKey
  }

删除过期的证书

此命令使用值为 0 的 cmdlet 的 Get-ChildItemExpiringInDays 参数来获取 WebHosting 存储中已过期的证书。

包含返回的证书的变量通过管道传递到 Remove-Item cmdlet,该 cmdlet 会删除它们。 该命令使用 DeleteKey 参数删除私钥和证书。

$expired = Get-ChildItem cert:\LocalMachine\WebHosting -ExpiringInDays 0
$expired | Remove-Item -DeleteKey

创建证书

New-Item cmdlet 不会在证书提供程序中创建新 证书 。 使用 New-SelfSignedCertificate cmdlet 创建用于测试的证书。

创建证书存储

在 Cert: 驱动器中 New-Item ,cmdlet 在 LocalMachine 存储位置创建证书存储。 它支持 NamePathWhatIfConfirm 参数。 忽略所有其他参数。 该命令返回表示新证书存储的 System.Security.Cryptography.X509Certificates.X509Store

此命令在 LocalMachine 存储位置中创建名为“CustomStore”的新证书存储。

New-Item -Path cert:\LocalMachine\CustomStore

在远程计算机上Create新的证书存储

此命令在 Server01 计算机上的 LocalMachine 存储位置中创建名为“HostingStore”的新证书存储。

命令使用 Invoke-Command cmdlet 在 Server01 计算机上运行 New-Item 命令。 该命令返回表示新证书存储的 System.Security.Cryptography.X509Certificates.X509Store

Invoke-Command { New-Item -Path cert:\LocalMachine\CustomStore } `
  -ComputerName Server01

为 WS-Man 创建客户端证书

此命令创建可由 WS-Management 客户端使用的 ClientCertificate 条目。 新的 ClientCertificate 将在 ClientCertificate 目录下显示为“ClientCertificate_1234567890”。 所有参数都是必需的。 颁发者必须是颁发者证书的指纹。

$cred = Get-Credential
New-Item -Path WSMan:\localhost\ClientCertificate `
         -Issuer 1b3fd224d66c6413fe20d21e38b304226d192dfe `
         -URI wmicimv2/* -Credential $cred

删除证书存储

从远程计算机中删除证书存储

此命令使用 Invoke-Command cmdlet 在 S1 和 S2 计算机上运行 Remove-Item 命令。 命令 Remove-Item 包含 Recurse 参数,该参数在删除存储区之前删除存储中的证书。

Invoke-Command { Remove-Item -Path cert:\LocalMachine\TestStore -Recurse } `
  -ComputerName S1, S2

动态参数

动态参数是由 PowerShell 提供程序添加的 cmdlet 参数,仅在启用提供程序的驱动器中使用 cmdlet 时才可用。 这些参数在证书提供程序的所有子目录中都有效,但仅在证书上有效。

注意

EnhancedKeyUsageList 属性执行筛选的参数还会返回具有空 EnhancedKeyUsageList 属性值的项。 具有空 EnhancedKeyUsageList 的证书可用于所有目的。

PowerShell 6.0 中删除了以下证书提供程序参数。

  • DNSName
  • DocumentEncryptionCert
  • EKU
  • ExpiringInDays
  • SSLServerAuthentication

CodeSigningCert <System.Management.Automation.SwitchParameter>

支持的 Cmdlet

此参数获取 在其 EnhancedKeyUsageList 属性值中具有“代码签名”的证书。

DeleteKey <System.Management.Automation.SwitchParameter>

支持的 Cmdlet

此参数在删除证书时删除关联的私钥。

重要

若要删除与远程计算机上存储区中的 Cert:\CurrentUser 用户证书关联的私钥,必须使用委托凭据。 cmdlet Invoke-Command 支持使用 CredSSP 参数进行凭据委派。 在使用 Remove-ItemInvoke-Command 和 凭据委派之前,应考虑任何安全风险。

已在 Windows PowerShell 3.0 中引入了此参数。

ItemType <字符串>

此参数允许指定 由 New-Item创建的项的类型。

Certificate在驱动器中,允许使用以下值:

  • Certificate 提供程序
  • 证书
  • 存储
  • StoreLocation

支持的 Cmdlet

脚本属性

新的脚本属性已添加到表示证书的 x509Certificate2 对象中,以便于搜索和管理证书。

  • DnsNameList:若要填充 DnsNameList 属性,证书提供程序将从 SUBJECTAlternativeName (SAN) 扩展中的 DNSName 条目复制内容。 如果 SAN 扩展为空,则使用证书的 Subject 字段中的内容填充该属性。

  • EnhancedKeyUsageList:若要填充 EnhancedKeyUsageList 属性,证书提供程序将复制证书中 EnhancedKeyUsage (EKU) 字段的 OID 属性,并为其创建一个友好名称。

  • SendAsTrustedIssuer:若要填充 SendAsTrustedIssuer 属性,证书提供程序将从证书复制 SendAsTrustedIssuer 属性。 有关详细信息 ,请参阅管理客户端身份验证的受信任颁发者

这些新功能允许你根据证书的 DNS 名称和到期日期搜索证书,并通过证书的增强型密钥使用 (EKU) 属性的值将客户端和服务器身份验证证书区分开来。

使用管道

提供程序 cmdlet 接受管道输入。 可以使用管道通过将提供程序数据从一个 cmdlet 发送到另一个提供程序 cmdlet 来简化任务。 若要详细了解如何将管道与提供程序 cmdlet 配合使用,请参阅本文中提供的 cmdlet 参考。

获取帮助

从 Windows PowerShell 3.0 开始,你可以获取有关提供程序 cmdlet 的自定义帮助主题,它们介绍了这些 cmdlet 在文件系统驱动器中的行为方式。

若要获取为文件系统驱动器自定义的帮助主题,请在文件系统驱动器中运行 Get-Help 命令或使用 -PathGet-Help 参数指定文件系统驱动器。

Get-Help Get-ChildItem
Get-Help Get-ChildItem -Path cert:

另请参阅

about_Providers

about_Signing

Get-AuthenticodeSignature

Set-AuthenticodeSignature

Get-PfxCertificate