這是極有可能的原因是與使用的服務器身份本身,當您的客戶端建立安全的SSL連接的證書有問題。根據我的經驗,這主要是由服務器返回的證書不是由受信任的根管理機構簽署的,或者鏈中的一個或多個證書無效(例如,它們已經過期或者針對的域不是您所使用的域連接到)。
爲了幫助識別問題,您可以嘗試瀏覽服務端點URL並查看瀏覽器是否報告任何問題。現代瀏覽器會警告你,如果服務器證書無效,有時會告訴你爲什麼。如果您使用的是Chrome瀏覽器,並且證書存在問題,則會在地址欄左端的掛鎖圖標(或多功能框)中看到一個紅色十字。如果你點擊掛鎖,Chrome會告訴你爲什麼它不喜歡證書。
至於你找到的代碼片段,這是一個如何在.Net中實現服務器證書驗證作爲客戶端的例子。但是,即使服務器證書存在問題,示例本身也不會拒絕與服務器的連接,因此有關在生產中不使用代碼的評論。在測試場景之外,您永遠不想與身份不明的服務器進行通信,因爲證書不正確,您無法信任該服務器。要提供「生產」實現,您必須檢查「錯誤」參數的值,以查看證書是否存在問題,並且只有在沒有問題時才返回true。
using System;
using System.Net;
using System.Net.Security;
using System.Security.Cryptography.X509Certificates;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
// Attach my certificate validation delegate.
ServicePointManager.ServerCertificateValidationCallback += ValidateRemoteCertificate;
System.Net.HttpWebRequest request = WebRequest.CreateHttp("https://www.google.com");
HttpWebResponse response = request.GetResponse() as HttpWebResponse;
}
private static bool ValidateRemoteCertificate(object sender, X509Certificate cert, X509Chain chain, SslPolicyErrors error)
{
if (error == SslPolicyErrors.None)
{
return true;
}
return false;
}
}
}
在這個例子中,我只是從我的ServerCertificateValidationCallback代表返回true,如果誤差值等於SslPolicyErrors.None,否則我返回false產生異常。爲了使這個例子工作,我使用Fiddler代理請求並將不可信證書返回給我的客戶端代碼。如果您在正常情況下導航到https://www.google.com,您應該而不是看到任何證書錯誤,因爲谷歌播放不錯!
帶證書的PKI可能是一個粗糙的工作區域。文檔Wikipedia has a good article on PKI涵蓋了如何使用可信機構對SSL中使用的證書進行簽名,以便客戶端可以信任他們正在與之通信的服務器的身份。