23

我有一个想与 ssl 一起使用的 ASP.NET Web API。当前服务器正在使用自签名证书,此时允许使用 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.

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

4

3 回答 3

44

看看C# Ignore certificate errors SO question。我相信您可以使用 ServicePointManager 添加证书验证处理程序来规避证书验证。不过,在您的生产环境中使用签名证书可能是个好主意。

ServicePointManager
    .ServerCertificateValidationCallback += 
    (sender, cert, chain, sslPolicyErrors) => true;
于 2013-03-04T16:41:18.350 回答
24

这对我有用。只需在调用 GetAsync 之前添加以下内容。

ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };

这将忽略 SSL 错误。仅建议在内网环境或其他无法伪造服务器身份的封闭网络中使用。

于 2014-11-07T18:51:50.803 回答
5

此错误消息意味着客户端在 SSL 握手期间不信任服务器证书。有些浏览器更宽容一些,会给你一个“红条”,但从代码调用会导致 401 和被拒绝的调用。

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

此异常消息告诉您在客户端上验证时自签名证书链被拒绝。您可能要通过导出(没有私钥)自签名证书并将其作为根证书安装在客户端计算机上来解决此问题。

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

这是一篇很好的文章,展示了使用 makecert 和 pvk2pfx 的过程。

编辑: 看起来可能有一种方法可以配置HttpClient为忽略 SSL 错误。但是,我强烈建议您从一开始就尽量不要出现 SSL 错误。

于 2013-03-04T16:14:47.297 回答