2015-09-02 57 views
1

我試圖修復現有的.Net 2.0服務/應用程序。sslStream.AuthenticateAsServer忽略RemoteCertificateValidationCallback

它是一個接受SSL/TLS連接的TCP服務器。如預期的那樣通過443端口運行。它用於響應Yealink供應請求。你可以在手機中彈出網址,它會得到設置等(無論如何不重要)。

問題是,當舊的手機要求這項服務,它工作正常,但現在,由於新版本的手機, 這是行不通的。

這是fials代碼:

using (SslStream sslStream = new SslStream(tcpClient.GetStream(), false, new RemoteCertificateValidationCallback(AcceptAllCertifications))) 
{ 
    X509Certificate c = new X509Certificate2("cert.pfx", "XXXX"); 
    sslStream.AuthenticateAsServer(c, false, SslProtocols.Tls, false); 

    // Process request etc 
} 

,這是 「AcceptAllCertifications」

private bool AcceptAllCertifications(object sender, X509Certificate certification, X509Chain chain, SslPolicyErrors sslPolicyErrors) 
{ 
    return true; 
} 

新手機導致應用程序產生的sslStream.AuthenticateAsServer錯誤(...) ;

System.componentmodel.win32exception:證書鏈由不受信任的頒發機構頒發給 。

是,「證書」他們在這裏提到我的證書(一個在服務器上)或他們的證書(一個從電話發送)?

我不知道(也不會有任何想法)有關用戶手機發送的證書的種類。

證書「cert.pfx」(我的證書)是從DigiCert購買的,(它是通配證書)。它是用密碼輸出的,噢,是的,我提到這個作品在所有常規瀏覽器和舊手機中都絕對沒問題......只是不是Yealink的新手機。

我該如何跳過整個身份驗證的事情,我只是想讓它工作,而不是公共系統?使用新手機時,「RemoteCertificateValidationCallback(AcceptAllCertifications)」永遠不會被調用,我用調試器跟蹤了它,完全跳過了它。

編輯: Certificate Checker

+1

我在想也許手機不喜歡你向他們展示的服務器端證書並停止SSL握手。如果他們不知道DigiCert的根CA證書,可能會發生這種情況。你可以在服務器上使用Wireshark來分析SSL握手嗎?那會告訴你,哪一方會中斷握手。 – Christoph

+0

其實......你現在就是。手機具有「僅接受可信證書」設置,默認情況下似乎已啓用。我現在可靠地創建和防止這個錯誤。當然,這是一個真正的痛苦,因爲我現在必須解除每個電話箱並切換此設置......多麼煩人! –

+0

在這樣做之前,我會嘗試從這些電話獲取受信任根證書的列表。您可能能夠購買源自Yeaklink手機中已存在的可信根證書的證書。 – Christoph

回答

0

我剛剛閱讀了關於中間證書(以上較早的評論在我的記憶失敗的),我想我知道問題是:您的電話已經信任DigiCert根證書頂部的信任鏈,但是你的服務器和你的電話都不瞭解證書實用程序顯示的中間證書的任何內容。除了您擁有私鑰的服務器證書之外,您還需要在服務器上安裝中間證書的公鑰。這裏是說明中間證書的功能更詳細地有用的鏈接:SSL Installing Intermediate Certificates

我引述:

中間證書,或證書,完成鏈由瀏覽器信任的根證書。在SSL協商期間,服務器將信任鏈發送給客戶端以協助客戶端構建和驗證信任鏈。

該頁面還包含有關如何測試必要的中間證書是否正確安裝在您的Web服務器上的說明。