在將我們的應用程序部署到我們的生產環境中之前,我們在.NET Web應用程序的較低環境中調用了一些數字API。承載這些API的那些服務器往往不具有由可信認證機構簽名的證書。ServicePointManager.ServerCertificateValidationCallback在Windows Server 2012 R2上不起作用
我創建了下面的代碼作爲一種解決方法,具有安全排除在我們的生產環境中運行這段代碼:
if (ignoreCertErrors && environmentName.ToLower() != "PROD")
{
ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
}
兩個ignoreCertErrors和environmentName是提供包含此邏輯方法的參數。
這個工作對我的地方發展對話框(Windows 7),但是當我部署它到Windows 2012 R2的測試服務器,我對API的調用與證書未仍信任失敗,出現以下錯誤:
================================================= ================ 消息:底層連接已關閉:發送時發生意外錯誤 。堆棧跟蹤:
在System.Net.HttpWebRequest.EndGetResponse(IAsyncResult的asyncResult)
在System.Net.Http.HttpClientHandler.GetResponseCallback(IAsyncResultar)============== ================================================== = 消息:無法從傳輸連接讀取數據: 現有連接被遠程主機強制關閉。堆棧 跟蹤:
在System.Net.TlsStream.EndWrite(IAsyncResult的asyncResult)
在System.Net.ConnectStream.WriteHeadersCallback(IAsyncResult的AR)============== ================================================== = 消息:一個現有的連接被強制由遠程主機 堆棧跟蹤封閉:
在System.Net.Sockets.Socket.EndReceive(IAsyncResult的asyncResult)
在System.Net.Sockets.NetworkStream.EndRead(IAsyncResult的asyncResult)================================================= ================
我是否需要更改此邏輯,或者做一些新的操作以忽略Windows Server 2012 R2上的證書警告?
可能無關緊要,但是您的意思是environmentName.ToUpper()!=「PROD」? – jtmnt
這是一個很好的結果,我們還沒有去生產。這並不能解決問題,因爲在任何情況下,它仍然是真的,所以代碼會執行。 – Josh
服務器SSL3是啓用還是禁用? https://technet.microsoft.com/en-us/library/security/3009008.aspx。 https://www.digicert.com/ssl-support/iis-disabling-ssl-v3.htm – jtmnt