. net客户端连接到ssl Web API

本文关键字:Web API ssl 客户端 连接 net | 更新日期: 2023-09-27 18:02:02

我有一个ASP。. NET Web API,我想使用ssl。目前服务器正在使用自签名证书,此时http和https都是允许的。我有一个非常基本的测试客户端工作良好的http,但不工作的https。我想知道如何修改下面的客户端代码,使其与https一起工作。目前,IE、Firefox和Chrome都可以使用http和https(带有证书警告)连接到Web API,所以这让我相信我不应该修改服务器上的任何东西,只需要修改客户端代码。下面是客户端代码:

static void Main(string[] args)
{
    try
    {
        if (args.Length != 1)
        {
            Console.WriteLine("Please provide a url, and only a url.");
            return;
        }
        var url = new Uri(args[0]);
        var urlAuthority = url.GetLeftPart(UriPartial.Authority);
        var urlPathQuery = args[0].Substring(urlAuthority.Length);
        HttpClient client = new HttpClient();
        client.BaseAddress = new Uri(urlAuthority);
        HttpResponseMessage response = client.GetAsync(urlPathQuery).Result;
        if (response.IsSuccessStatusCode)
            Console.WriteLine(response.Content.ReadAsAsync<string>().Result); // expecting scalar results only
        else
            Console.WriteLine("{0} ({1})", (int)response.StatusCode, response.ReasonPhrase);
    }
    catch (Exception ex)
    {
        Exception tempEx = ex;
        while (tempEx != null)
        {
            Console.WriteLine(tempEx.Message);
            tempEx = tempEx.InnerException;
        }
    }
}

当我用http url运行上面的代码时,它工作得很好。当我将url更改为https时,打印出以下错误:

One or more errors occurred.
An error occurred while sending the request.
The underlying connection was closed: Could not establish trust relationship for the SSL/TLS secure channel.
The remote certificate is invalid according to the validation procedure.

我的一个问题是,如果客户端必须手动发送公钥到服务器,以便它知道如何发送回加密响应,或者如果这在幕后自动发生?第二,现在看到最后一个错误后,我想知道我是否还必须在客户端内做其他事情来忽略证书警告,只是相信这个证书可以继续?

. net客户端连接到ssl Web API

看看c#忽略证书错误SO问题。我相信您可以使用ServicePointManager添加一个证书验证处理程序来规避证书验证。不过,在您的生产环境中使用已签名的证书可能是个好主意。

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

这对我很有效。只需在调用GetAsync之前添加以下代码:

ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };

这将忽略SSL错误。这只建议在内网环境或其他封闭网络中,服务器身份不能伪造。

此错误消息表示客户端在SSL握手期间不信任服务器证书。有些浏览器比较宽容,会给你一个"红色条",但是从代码中调用会导致401和一个被拒绝的调用。

您不需要对IIS中的客户端证书设置做任何操作(因为我假设您没有使用客户端证书)。

此异常消息告诉您,在客户端验证时拒绝了自签名证书链。您可以通过导出(不带私钥)自签名证书并将其作为根证书安装在客户机上来解决这个问题。

如果这不起作用,您需要制作一个新的CA(证书颁发机构证书),然后生成一个由CA签名的新服务器证书。该CA最终必须作为根证书安装在客户机上。

这是一个很好的帖子,展示了使用makecert和pvk2pfx的过程。

编辑:

似乎有一种方法可以将HttpClient配置为忽略SSL错误。但是,我强烈建议您从一开始就不要出现SSL错误。