2017-06-06 124 views
2

我知道ServicePointManager.ServerCertificateValidationCallback不再對.NET核心存在,轉而代之以:但是,我們目前正在使用的ServiceStack.Core上DOTNET的核心服務繞過SSL證書驗證堆棧

using(var handler = new System.Net.Http.HttpClientHandler()) 
{ 
    using (var httpClient = new System.Net.Http.HttpClient(handler)) 
    { 
     handler.ServerCertificateCustomValidationCallback = (request, cert, chain, errors) => 
     { 
      return true; 
     }; 

    } 
} 

其中,據我可以看到,不會公開像這樣的屬性或處理程序本身。

我該如何告訴ServiceStack客戶端繞過此代碼中的ssl驗證?

using(var client = new JsonServiceClient("https://www.google.com")) 
{ 
    var response = client.Get("/results"); 
} 

如果有辦法,在Windows和Linux上都可以工作嗎?

+0

*「繞過SSL證書驗證...」 - 聽起來很糟糕。它將您的應用程序轉移到[世界上最危險的代碼:在非瀏覽器軟件中驗證SSL證書]的領域(http://crypto.stanford.edu/~dabo/pubs/abstracts/ssl-client-bugs。 HTML)。也許你應該將它改爲*「如何執行自定義驗證...」*,然後執行對您的應用程序有意義的檢查。 – jww

+0

@jww「世界上最危險的代碼」聽起來非常誇張,特別是沒有上下文。如果您正在使用自簽名證書訪問內部服務,那該怎麼辦? –

+1

如果您有自簽名證書,則可以驗證它。沒有必要放棄或避免驗證。您甚至可以跳過證書驗證並跳轉到公鑰固定。在固定的情況下,證書只是一個演示文稿的詳細信息,並且您需要的只是主機的公鑰以識別它。我想你可能會問錯誤的問題,但我不知道足以說明問題。也許你應該退後一步,並提出問題,例如如何在服務中使用自簽名證書。 – jww

回答

6

JsonServiceClient建立在.NET HttpWebRequest上,它已被.NET Core重寫爲wrapper over HttpClient,所以我們通常建議.NET Core避免這種開銷(這比.NET 4.5慢很多),並切換到使用JsonHttpClient in ServiceStack.HttpClient,而不是因爲它使用HttpClient直接在這裏您可以注入自己的HttpClientHandler有:

var client = new JsonHttpClient(baseUrl) 
{ 
    HttpMessageHandler = new HttpClientHandler 
    { 
     UseCookies = true, 
     AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate, 
     ServerCertificateCustomValidationCallback = (req,cert,chain,errors) => true 
    } 
}; 

注意它的建議reuse HttpClient instances所以你應該嘗試儘可能重用HttpClient的情況下,避免處置它們。