[英]How to get Thumbprint or Public Key of Issuer Certificate?
我們創建了一個自簽名 CA 證書,我們用它來簽署其他證書以用於 SSL 目的。 這些證書將安裝在我們無法訪問的其他服務器中,並將嚴格與其他客戶端(如移動應用程序)進行通信。
當這些客戶端(用 .NET 編寫)使用 HTTPS 向服務器發出請求時,我們會收到“從服務器收到的無效證書”錯誤,因為 CA 證書不是該客戶端上的受信任 CA。
我們想使用ServicePointManager.ServerCertificateValidationCallback
繞過這種安全性,但前提是所使用的證書是由我們的 CA 證書簽名的。
我可以檢查certificate.Issuer
,但這很容易被任何人欺騙。 如何獲取無效證書的頒發者證書的指紋或公鑰? 如果我可以訪問它,我可以輕松地將它與我知道的有效的進行比較,並忽略證書錯誤並繼續請求。
更新
我想我越來越近了。 看起來我們想要做的事情是不可行的,所以方向略有不同。
使用X509Chain
,我們可以使用以下代碼驗證證書是否是 CA 的子證書:
var caCert = new X509Certificate2(@"[path]\MyCA.cer");
var newChain = new X509Chain();
newChain.ChainPolicy.RevocationMode = X509RevocationMode.NoCheck;
newChain.ChainPolicy.ExtraStore.Add(caCert);
var res = newChain.Build(certInQuestion);
Build()
仍然返回 false (正如預期的那樣,因為 CA 在客戶端上不受信任),但現在newChain.ChainStatus[0].Status
正在返回UntrustedRoot
。 根據我的測試,這意味着鏈經過驗證,因為如果我提供不同的 CA 證書,它會因InvalidChain
而失敗。
總之,這告訴我,如果 Status 是UntrustedRoot
,則證書是使用我們的 CA 證書創建的,因此它是有效的,否則它是假的!
我的假設正確嗎?
我不完全確定這就是您正在尋找的東西,但它可能會將您推向正確的方向。 這是我用來查找剛剛使用 MAKECERT.EXE 和 CERTMGR.EXE 創建和提取的證書的 PowerShell 腳本:
# get certificate thumbprint
$appCertificate = Get-PfxCertificate -FilePath $certificateFullPath
Write-Host " .. adding certificate to local machine root" -ForegroundColor Gray
& $ExeCertManager /add $certificateFullPath /s /r localMachine root
Write-Host " Certificate installed on local machine" -ForegroundColor Gray
Write-Host " .. exporting private key for certificate" -ForegroundColor Gray
Get-ChildItem cert:\\localmachine\my | Where-Object {$_.Thumbprint -eq $appCertificate.Thumbprint} | ForEach-Object {
$CertPfxName = (Get-Item -Path $certificateFullPath).BaseName
}
那是錯誤的解決方案。 您應該在所有客戶端中將您的自簽名證書安裝為受信任的 CA 證書,或者最好還是讓已受信任的 CA 對其進行簽名。 不要為此編寫代碼。
根據以下答案,似乎一個可能的解決方案是您可以通過電子郵件發送證書: https ://stackoverflow.com/a/4473799/674700。
以下是一些信息鏈接和一些生成免費公鑰和私鑰的工具:
https://www.igolder.com/pgp/generate-key/
我認為 EJP 的解決方案是最能接受的。 @EJP,您能否給我們一些可以幫助我們成為“微型 CA”的應用程序示例。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.