HttpClient使用自签名证书调用HTTPS WebApi

时间:2014-11-17 10:03:20

标签: c# security ssl https dotnet-httpclient

在我们的开发阶段,我们创建了一个自签名证书,这意味着我有.cer.pfx文件。当我们尝试调用API时,是否有任何方法可用于在HTTPS请求中嵌入上述文件,因此并非每个客户端都将证书安装到本地可信证书存储区。

这可能吗?我发现了一些似乎我们可以这样做的API,但却无法让它成功:

try
{
    var secure = new SecureString();
    foreach (char s in "password")
    {
        secure.AppendChar(s);
    }

    var handler = new WebRequestHandler();
    handler.ClientCertificateOptions = ClientCertificateOption.Manual;
    handler.UseProxy = false;

    var certificate = new X509Certificate2(@"C:\httpstest2.pfx", secure);
    handler.ClientCertificates.Add(certificate);

    using (var httpClient = new HttpClient(handler))
    {
        httpClient.BaseAddress = new Uri("https://www.abc.com");
        var foo = httpClient.GetStringAsync("api/value").Result;
        Console.WriteLine(foo);
    }
}
catch (Exception ex)
{
    Console.WriteLine(ex);
}
  1. 我是否需要使用X509Certificate代替X509Certificate2
  2. 如果我们从第三方公司购买真实证书,我们是否可以在不关心证书问题的情况下完成验证例外?

2 个答案:

答案 0 :(得分:3)

您可以使用此代码忽略任何SSL错误

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

显然要确保它不能投入生产。

答案 1 :(得分:0)

客户端只需要.cer文件中的公钥,该公钥在建立https连接时自动发送。但是,客户是否信任该证书不是决定,应该允许发送证书的服务器做出决定。

您可以使用组策略将证书分发给您的客户端。有关详细信息,请参阅http://technet.microsoft.com/en-us/library/cc770315(v=ws.10).aspx