我們已經創建了一個自簽名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證書創建的,因此它是有效的,其他任何東西都是假的!
我的假設是否正確?
如果我有發行人的公鑰,也許我可以做一些事情來驗證證書與該密鑰? –