2013-01-31 66 views
6

我們已經創建了一個自簽名CA證書,我們用它來簽署其他SSL證書證書。這些證書將安裝在我們無法訪問的其他服務器上,並將嚴格與其他客戶端(如移動應用程序)進行通信。如何獲取發行人證書的指紋或公鑰?

當這些客戶端(.NET編寫)使用做出服務器的請求HTTPS我們得到錯誤「從服務器接收證書無效」的,因爲CA證書是不是客戶端的可信CA。

我們想繞過使用ServicePointManager.ServerCertificateValidationCallback此安全,但前提是所使用的證書是由我們的CA證書籤名。

我可以檢查certificate.Issuer,但很容易被任何人都被欺騙。如何獲取無效證書頒發者證書的指紋或公鑰?如果我可以訪問它,我可以輕鬆地將其與我所知的有效比較,並忽略證書錯誤並繼續處理請求。

UPDATE

我覺得我越來越近。看起來我們想要做的是不可行的,所以走了一個稍微不同的方向。

使用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失敗。

總之,這告訴我,如果狀態爲UntrustedRoot,那麼證書是我們的CA證書創建的,因此它是有效的,其他任何東西都是假的!

我的假設是否正確?

+0

如果我有發行人的公鑰,也許我可以做一些事情來驗證證書與該密鑰? –

回答

0

我不完全確定這是你要找的東西,但它可能會把你推向正確的方向。這裏有一個PowerShell腳本我用它來發現我剛剛創建和使用提取MAKECERT.EXE & CERTMGR.EXE一個證書:

# 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 
} 
+0

謝謝安德魯,但我試圖在移動應用程序中以編程方式驗證證書頒發者的公鑰或指紋。 –

0

這是錯誤的解決方案。您應該將自簽名證書作爲可信CA證書安裝在所有客戶端中,或者更好地僅由獲得信任的CA簽名。不要爲此編寫代碼。

+0

在所有客戶端安裝CA證書是不可管理的。我希望能夠由可信任的CA簽署它,但是我們爲什麼要這樣做會出現業務決策。 –

+0

A *很差*商業決定。有審查​​。獲得簽名將花費你五十塊錢,花費大約24小時,並立即,正確,安全地工作。編寫代碼並進行測試等將花費數千美元,如果不是幾周,則需要花費數天時間,並引入安全風險,甚至無法量化。 – EJP

+0

它不是一個單一的證書。這些證書安裝在客戶的服務器上,因此它將成爲每個客戶的證書。業務決策是儘可能簡化服務器的安裝,並且每年通過獲得SSL證書的過程不是他們希望客戶經歷的選項。 –

0

看來,一個可能的解決辦法是,你可以通過電子郵件發送的證書,按照這樣的回答:https://stackoverflow.com/a/4473799/674700

+0

是的,我知道我可以安裝CA證書,但是現在寧願遠離它。移動客戶端現在是iOS,稍後將會是Android和WP。 –

0

這裏是與信息和一些鏈接一些工具來生成免費的公共密鑰和私有密鑰:

https://www.igolder.com/pgp/

https://www.igolder.com/pgp/generate-key/

我覺得EJP的解決方案是最能接受的。@EJP,你能給我們一些可以幫助我們成爲「微小CA」的應用程序的例子嗎?

+0

[TinyCA](http://tinyca.sm-zone.net/)是一個(因此名稱)。 [XCA](http://xca.sourceforge.net/)是另一個(跨平臺)。 – Bruno

+0

謝謝,我正在尋找那種工具......! – user2088532