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

时间:2016-11-05 17:06:21

标签: windows powershell ssl-certificate self-signed certificate-authority

使用powershell调查Certificate Provider我注意到所有路径似乎类似但与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),展示了我如何使用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 个答案:

答案 0 :(得分:9)

以下是容器(括号中)与其描述之间的映射:

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