2010-08-10 87 views
2

我寫一個測試,測試服務,我部署,繞過SSL證書檢查我使用的代碼段下面實現的SSL覆蓋:恢復SSL證書覆蓋檢查


public static void SSLValidationOverride() 
     { 
      ServicePointManager.ServerCertificateValidationCallback = new     RemoteCertificateValidationCallback(OnValidationCallback); 
     } 
private static bool OnValidationCallback(object sender, X509Certificate cert, X509Chain chain, SslPolicyErrors errors) 
{ 
if (cert.subject == MyCertSubject) 
     return true; 
else 
     return false; 
} 

現在我必須調用另一個webservice在代碼中使用ssl,並且希望在調用之前切換到默認的ssl檢查。什麼是最好的方式來做到這一點。 MS幫助表示ServicePointManager.SecurityProtocol的默認值爲空(http://msdn.microsoft.com/en-us/library/system.net.servicepointmanager.securityprotocol.aspx)。將它設置爲null將切換到默認的ssl驗證,並有任何其他方式來做到這一點。

回答

2

我結束了將ServicePointManager.SecurityProtocol設置爲空,它工作正常。雖然我仍然開放更好的方式來做到這一點


public static void SSLValidationRestore() 
     { 
      ServicePointManager.ServerCertificateValidationCallback = null; 
     } 
+0

適合我。使用各種情況進行測試(好的和不好的https網址)。 – 2015-05-28 19:32:40

2

將回調設置爲null不起作用。相反所有的證書都通過了。我不明白爲什麼有那麼多人發佈設置值爲空作品或 - =作品。至少在3.5時間裏,工作都沒有...。經過進一步測試,似乎該檢查只是緩存。一旦證書被驗證一次,重新檢查不會導致回調被調用。

+0

我不同意這一點。我只是使用好的和不好的HTTPS url來測試每種方式。通過將其設置回null,它看起來像回到默認行爲。 – 2015-05-28 19:31:13

6

我在創建診斷工具的過程中遇到了類似的問題。我創建了一個窗口服務,向請求列表中的url列表發送請求。每個網址我讓沒有證書驗證的請求通過設置這樣的:

ServicePointManager.ServerCertificateValidationCallback = delegate { return true; }; 

,然後用相同的URL我也試圖通過重置屬性爲null,這樣應該提供的默認功能爲與證書驗證的請求:

ServicePointManager.ServerCertificateValidationCallback = null; 

這帶來了意想不到的結果,就好像復位就已經忽視了我的請求仍然沒有證書驗證做。調試後,我發現,如果我設置

ServicePointManager.ServerCertificateValidationCallback = null; 

後等待足夠長時間,然後它實際上是重置和我的請求被默認證書驗證做。所以我只是把一個睡在30秒之前,我所提出的要求:

ServicePointManager.ServerCertificateValidationCallback = null; 
System.Threading.Thread.Sleep(30000); 
//Make request here 

我不明白爲什麼這個工作,但它確實和我敢肯定有這樣做的更好的方法,如果你知道如何,請讓我知道。

+0

採用相同的解決方案。我之前使用委託來禁用它,然後使用try/catch/finally在finally中將其設置爲null。 – 2015-05-28 19:31:50

0

我遇到了類似的問題。您可以將ServicePointManager.MaxServicePointIdleTime更改爲較低值,而不是在@Acode Monkey解決方案上調用Thread.Sleep()。

ServicePointManager.MaxServicePointIdleTime = 1;