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

13
使用PowerShell调查证书提供程序时,我注意到所有路径都似乎相似,但与certmgr中的文件夹结构不完全相同。很明显:
Certs:\LocalMachine ~= Certificates (Local Computer)
Certs:\CurrentUser ~= Certificates - Current User

我还猜测:

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

但是我一直无法找到任何官方参考资料(甚至是合理的解释),来给我带来我所期望的温馨感觉...

我的目的是在本地测试一个https WCF服务(服务器和客户端都需要测试)。我可以使用New-SelfSignedCertificate轻松生成服务器所需的自签名证书。然而,如果我尝试将我的客户端(也是.NET)指向该服务,则由于服务提供了一个不受信任的证书,连接失败。

我发现了一些过时的参考资料(比如this one),这些资料展示了如何使用makecert(现已被弃用)和certmgr来生成一个证书颁发机构,然后使用它来签署我的https服务证书,并将证书颁发机构证书安装到信任的根证书颁发机构容器中,以使所有东西都能正常工作。虽然这种方法可能有效,但肯定不够开发/自动化友好。
话虽如此,我仍然可以使用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文件夹的任何信息吗?

1个回答

27

下面是容器(用括号表示)与它们的描述之间的映射关系:

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

  • 谢谢,这正是我在寻找的。你有微软官方文档的链接吗?还是这只是你随着时间学习到的东西? - Lucas
    我很久以前从各种 MSDN 文章中收集了这些信息,但恐怕我无法找回确切的链接。它存在于我的内部文档中,就像现在这样。 - Crypt32
    很酷,我得去看看你的pki项目,因为我的努力仍然遇到了信任问题...不确定我做错了什么。再次感谢。 - Lucas

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接