允许使用HttpClient的不可信SSL证书

我努力让我的Windows 8应用程序通过SSL与我的testingWeb API进行通信。

看来,HttpClient / HttpClientHandler没有提供和选项来忽略不受信任的证书,如WebRequest使您能够(尽pipe在与ServerCertificateValidationCallback “hacky”的方式)。

任何帮助将非常感激!

在Windows 8.1中,您现在可以信任无效的SSL证书。 你必须使用Windows.Web.HttpClient或者如果你想使用System.Net.Http.HttpClient,你可以使用我写的消息处理器适配器: http : //www.nuget.org/packages/WinRtHttpClientHandler

文档位于GitHub上: https : //github.com/onovotny/WinRtHttpClientHandler

一个快速和肮脏的解决scheme是使用ServicePointManager.ServerCertificateValidationCallback委托。 这使您可以提供自己的证书validation。 validation在整个App域中全局应用。

 ServicePointManager.ServerCertificateValidationCallback += (sender, cert, chain, sslPolicyErrors) => true; 

我主要用于unit testing的情况下,我想运行在我正在主持的端点,并试图用WCF客户端或HttpClient击中它。

对于产品代码,您可能需要更细粒度的控制,使用WebRequestHandler及其ServerCertificateValidationCallback委托属性会更好(请参阅下面的dtb的答案 )。

看看WebRequestHandler类和它的ServerCertificateValidationCallback属性 :

 using (var handler = new WebRequestHandler()) { handler.ServerCertificateValidationCallback = ... using (var client = new HttpClient(handler)) { ... } } 

或者您可以使用Windows.Web.Http命名空间中的HttpClient:

 var filter = new HttpBaseProtocolFilter(); #if DEBUG filter.IgnorableServerCertificateErrors.Add(ChainValidationResult.Expired); filter.IgnorableServerCertificateErrors.Add(ChainValidationResult.Untrusted); filter.IgnorableServerCertificateErrors.Add(ChainValidationResult.InvalidName); #endif using (var httpClient = new HttpClient(filter)) { ... } 

如果这是针对Windows运行时应用程序的,那么您必须将自签名证书添加到项目中,并在appxmanifest中引用它。

该文档在这里: http : //msdn.microsoft.com/en-us/library/windows/apps/hh465031.aspx

同样的事情,如果它来自不受信任的CA(如机器本身不信任的专用CA) – 您需要获取CA的公共证书,将其作为内容添加到应用程序,然后将其添加到清单。

一旦完成,应用程序将把它看作一个正确签名的证书。

我没有答案,但我有另一种select。

如果您使用Fiddler2来监控stream量并启用HTTPS解密,您的开发环境将不会有任何抱怨。 这不适用于WinRT设备,如Microsoft Surface,因为您无法在其上安装标准应用程序。 但是你的开发Win8电脑就没事了。

要在Fiddler2中启用HTTPSencryption,请转至工具> Fiddler选项> HTTPS(选项卡)>选中“解密HTTPSstream量”

我将继续关注这个线程,希望能有一个优雅的解决scheme。

如果你正在尝试在.NET标准库中这样做,这里有一个简单的解决scheme,只是在你的处理程序中返回true所有风险。 我把安全留给你。

 var handler = new HttpClientHandler(); handler.ClientCertificateOptions = ClientCertificateOption.Manual; handler.ServerCertificateCustomValidationCallback = (httpRequestMessage, cert, cetChain, policyErrors) => { return true; }; var client = new HttpClient(handler); 

我在网上find了一个似乎运作良好的例子:

首先你创build一个新的ICertificatePolicy

 using System.Security.Cryptography.X509Certificates; using System.Net; public class MyPolicy : ICertificatePolicy { public bool CheckValidationResult(ServicePoint srvPoint, X509Certificate certificate, WebRequest request, int certificateProblem) { //Return True to force the certificate to be accepted. return true; } } 

然后在发送你的http请求之前就使用这个:

 System.Net.ServicePointManager.CertificatePolicy = new MyPolicy(); 

http://www.terminally-incoherent.com/blog/2008/05/05/send-a-https-post-request-with-c/