有人知道 powershell 证书提供程序路径如何映射到 certmgr.msc 文件夹吗?

Does anybody know how the powershell certificate provider paths map to certmgr.msc folders?

使用powershell调查时Certificate Provider i noticed that all the paths seem similar but not the same as the folder structure within certmgr。似乎很清楚:

Certs:\LocalMachine ~= Certificates (Local Computer)
Certs:\CurrentUser ~= Certificates - Current User

我也在猜测:

Root ~= Trusted Root Certification Authority
My ~= Personal
WebHosting ~= WebHosting
...

但是我一直找不到任何形式的官方参考(甚至是合理的解释)来给我 warm fuzzy 我正在寻找的...

我的目的是在本地(服务器端和客户端)测试 https WCF 服务。我可以使用 New-SelfSignedCertificate 轻松生成服务器所需的自签名证书。但是,如果我尝试将我的客户端(也是 .NET)指向该服务,则它无法连接,因为该服务提供的是不受信任的证书。

我找到了各种过时的参考资料(如this one), showing how I could use a combination of makecert(现已弃用)和certmgr来生成证书颁发机构,然后用它来签署证书对于我的 https 服务,然后将证书颁发机构 cert 安装到 Trusted Root Certification Authority 容器中以使一切正常。虽然这种方法可能有效,但肯定不是 developer/automation 友好的。

也就是说,我能够使用 powershell 来执行此操作:

$my_cert_store_location = "Cert:\LocalMachine\My"
$root_cert_store_location = "Cert:\LocalMachine\Root"
$root_friendly_name = "Test Root Authority"
$root_cert_subject = "CN=$($root_friendly_name)"
# The ip and port you want to reserve for your app
$ipport = "127.0.0.11:8734"
# Your app guid (found in ApplicationInfo.cs)
$appid = "{f77c65bd-d592-4a7b-ae32-cab24130fdf6}"
# Your dns name
$dns_name = "my-machine-local"
$rebuild_root_cert = $false

$root_cert = Get-ChildItem $my_cert_store_location | 
    Where-Object {$_.SubjectName.Name.Equals($root_cert_subject)}
if ($root_cert -and $rebuild_root_cert) 
{
    Get-ChildItem $root_cert_store_location |
        Where-Object {$_.SubjectName.Name.Equals($root_cert_subject)} |
        Remove-Item

    Remove-Item $root_cert
    $root_cert = $false
}
if (-not $root_cert) 
{
    $root_cert = New-SelfSignedCertificate `
        -Type Custom `
        -FriendlyName $root_friendly_name `
        -HashAlgorithm sha384 `
        -KeyAlgorithm RSA `
        -KeyLength 4096 `
        -Subject $root_cert_subject `
        -KeyUsage DigitalSignature, CertSign `
        -NotAfter (Get-Date).AddYears(20) `
        -CertStoreLocation $my_cert_store_location
    Write-Output "Created root cert: $($root_cert.Thumbprint)"

    $exported_cert = New-TemporaryFile
    Export-Certificate -Cert $root_cert -FilePath $exported_cert.FullName
    $imported_root_cert = Import-Certificate -FilePath $exported_cert.FullName `
        -CertStoreLocation $root_cert_store_location
    Write-Output "Imported root cert to: $($root_cert_store_location)$($imported_root_cert.Thumbprint)"
}

Write-Output "Root cert is: $($root_cert.Thumbprint)"

$test_signed_cert_subject = "CN=$($dns_name)"
$test_signed_cert = Get-ChildItem $my_cert_store_location | 
    Where-Object {$_.SubjectName.Name.Equals($test_signed_cert_subject)}
if (-not $test_signed_cert)
{
    $test_signed_cert = New-SelfSignedCertificate `
        -Type Custom `
        -Subject $test_signed_cert_subject `
        -FriendlyName $dns_name `
        -Signer $root_cert `
        -CertStoreLocation $my_cert_store_location
    Write-Output "Created signed cert: $($test_signed_cert.Thumbprint)"
}

Write-Output "Signed cert is: $($test_signed_cert.Thumbprint)"

if ($test_signed_cert)
{
    netsh http delete sslcert `
        ipport="$($ipport)"
    netsh http add sslcert `
        ipport="$($ipport)" `
        appid="$($appid)" `
        certstorename="My" `
        certhash="$($test_signed_cert.Thumbprint)"
    Write-Output "Assigned signed cert to: $($ipport)"
}

但问题仍然存在...是否有任何关于证书提供程序路径如何映射到 certmgr 文件夹的信息?

这里是容器(在括号中)和它们的描述之间的映射:

  • 个人(我的) — 此容器用于存储带有私钥的证书。使用证书私钥时,应用程序会查看此容器以找到适当的证书和关联的私钥。
  • 受信任的根证书颁发机构 (ROOT) — 此容器包含不带私钥的受信任的自签名证书。每个证书链必须链接到一个以自签名形式呈现的证书。此自签名证书是“根证书”或“受信任的锚点”。但是,并非所有根证书都可以被视为受信任的。您应该仔细选择您认为可信的新证书。
  • Enterprise Trust(信任) — 此容器用于存储证书信任列表 (CTL)。例如,密钥管理服务器将其证书添加到此容器。
  • 中级证书颁发机构 (CA) — 此容器保留许多不同类型的 CA 证书。这些证书通常由证书链引擎用来构建证书链。
  • Trusted Publishers (TrustedPublisher) — 此容器保留明确可信的签名证书。虽然数字签名证书链接到受信任的根证书颁发机构,但许多应用程序(例如 Microsoft Office 和 Windows PowerShell)需要在此容器中存储特定的签名证书,以便信任来自该特定签名者的签名。这意味着数字签名感知应用程序可以信任一个签名证书但不信任另一个签名证书,即使两个证书都是由同一证书颁发机构颁发的。
  • 不受信任的证书(不允许) — 此容器保留明确不受信任的证书。如果您决定不信任特定证书或特定证书颁发机构颁发的所有证书,只需将这些证书添加到此容器即可。默认情况下,此容器已包含两个证书。强烈建议不要将它们从容器中取出。有关更多信息,请阅读以下文章:http://support.microsoft.com/kb/293817.
  • 第三方根证书颁发机构 (AuthRoot) — 此证书容器类似于受信任的根证书颁发机构。它保留来自 Microsoft 根证书程序的证书。有关 Microsoft 根证书程序的更多信息,请阅读以下文章:http://support.microsoft.com/kb/931125.
  • 受信任的人 (TrustedPeople) — 此容器保存颁发给明确受信任的人或终端实体的证书。大多数情况下,这些是自签名证书或在 Microsoft Outlook 等应用程序中明确信任的证书。要与其他方共享 EFS 加密文件,您必须在此存储中拥有他们的证书。
  • 证书注册请求 (REQUEST) — 此容器存储证书注册请求,直到将这些请求提交给证书颁发机构。当证书颁发机构响应请求颁发证书时,您需要使用特殊实用程序将证书安装到此容器,例如 CertReq.exe。之后,证书注册请求作为证书传输到个人(我的)容器。
  • 智能卡可信根 (SmartCardRoot) — 此容器用于存储可信智能卡证书。
  • 其他人(地址簿) — 此容器维护已添加到 Outlook 联系人的证书。
  • Active Directory 用户对象 (UserdDS) — 此容器用于存储与用户对象关联并在 Active Directory 中发布的证书。此容器的内容等于查看用户对象的属性时在 Active Directory 用户和计算机控制台的高级视图中显示的证书。