0

當使用powershell來調查Certificate Provider我注意到所有的路徑似乎類似但不同於certmgr內的文件夾結構。它似乎很清楚:有誰知道powershell證書提供程序路徑如何映射到certmgr.msc文件夾?

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

這裏是容器(括號內)和它們的描述之間的映射:

  • 個人(我) - 這個容器是用來存儲與私鑰證書。當使用證書私鑰時,應用程序將查找此容器以查找相應的證書和相關私鑰。
  • 受信任的根證書頒發機構(ROOT) - 此容器包含不帶私鑰的可信自簽名證書。每個證書鏈必須鏈接到以自簽名表格提供的證書。此自簽名證書是「根證書」或「可信錨點」。但是,並非所有根證書都可以視爲可信。您應該仔細選擇您認爲可信的新證書。
  • Enterprise Trust(trust) - 此容器用於存儲證書信任列表(CTL)。例如,密鑰管理服務器將其證書添加到此容器。
  • 中級證書頒發機構(CA) - 此容器保留許多不同類型的CA證書。這些證書通常由證書鏈引擎用於構建證書鏈。
  • 受信任的發佈者(TrustedPublisher) - 此容器保留明確信任的簽名證書。雖然數字簽名證書鏈接到受信任的根證書頒發機構,但爲了信任來自特定簽名者的簽名,許多應用程序(例如Microsoft Office和Windows PowerShell)需要在此容器中存儲特定的簽名證書。這意味着即使兩個證書都由同一證書頒發機構簽發,數字簽名感知應用程序也可以信任一個簽名證書,但不信任另一個簽名證書。
  • 不可信證書(不允許) - 此容器保留明確不受信任的證書。如果您決定不信任特定證書或特定證書頒發機構頒發的所有證書,只需將這些證書添加到此容器。默認情況下,此容器已包含兩個證書。強烈建議不要將它們從容器中取出。有關其他信息,請閱讀以下文章:http://support.microsoft.com/kb/293817
  • 第三方根證書頒發機構(AuthRoot) - 此證書容器與受信任的根證書頒發機構類似。它保留來自Microsoft根證書程序的證書。有關Microsoft根證書程序的更多信息,請閱讀以下文章:http://support.microsoft.com/kb/931125
  • 受信任的人(TrustedPeople) - 該容器將證書頒發給明確信任的人或最終實體。大多數情況下,這些都是自簽名證書或在Microsoft Outlook等應用程序中明確信任的證書。要與其他方共享EFS加密文件,您必須在此商店中擁有其證書。
  • 證書註冊請求(請求) - 此容器存儲證書註冊請求,直到將這些請求提交給證書頒發機構。當證書頒發機構爲響應請求而頒發證書時,您需要使用特殊的實用程序(如CertReq.exe)將證書安裝到此容器中。之後,證書註冊請求將作爲證書傳輸到個人(我的)容器。
  • 智能卡可信根(SmartCardRoot) - 此容器用於存儲可信任的智能卡證書。
  • 其他人(地址簿) - 此容器維護已添加到Outlook聯繫人的證書。
  • Active Directory用戶對象(UserdDS) - 此容器用於存儲與用戶對象關聯並在Active Directory中發佈的證書。此容器的內容等同於在查看用戶對象的屬性時在Active Directory用戶和計算機控制檯的高級視圖中顯示的證書。
+0

謝謝,這正是我正在尋找的。你有鏈接到源材料(微軟官方文檔),或者這只是你隨着時間的推移而學習的東西嗎? – Lucas

+0

我從各種MSDN文章中收集了這些信息(很久以前),並且我不太可能恢復確切的鏈接。它存在於我的內部文檔中。 – Crypt32

+0

很酷,我將不得不查看你的[pki項目](https://pspki.codeplex.com/SourceControl/list/changesets?branch=default),因爲我上面列出的努力會繼續陷入信任問題。不知道我做錯了什麼。再次感謝。 – Lucas

相關問題