允许使用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/