如何使用C#中的HttpClient通过IP地址启动与服务器的可信TLS连接?

时间:2018-03-05 15:12:50

标签: c# .net ssl .net-core

我正在尝试使用Windows上的C#HttpClient建立与(本地)VM中运行的应用程序的TLS连接。但是,每次都会导致RemoteCertificateNameMismatch错误。

这段代码:

HttpClientHandler handler = new HttpClientHandler();
handler.ServerCertificateCustomValidationCallback = (request, cert, chain, policyErrors) =>
{
    Console.WriteLine($"Policy Errors: {policyErrors}");
    return policyErrors == SslPolicyErrors.None;
};
HttpClient httpClient = new HttpClient(handler)
{
    BaseAddress = new Uri("https://192.168.99.100/engine-rest")
};
var result = httpClient.GetAsync("/engine").Result;

导致此错误:

Policy Errors: RemoteCertificateNameMismatch

Unhandled Exception: System.AggregateException: One or more errors occurred. (An error occurred while sending the request.) ---> System.Net.Http.HttpRequestException: An error occurred while sending the request. ---> System.Net.Http.WinHttpxception: A security error occurred
   at System.Net.Http.WinHttpRequestCallback.OnRequestSendingRequest(WinHttpRequestState state)
   at System.Net.Http.WinHttpRequestCallback.RequestCallback(IntPtr handle, WinHttpRequestState state, UInt32 internetStatus, IntPtr statusInformation, UInt32 statusInformationLength)

但是,我的证书根据Google Chrome和Mozilla Firefox有效,但不适用于Internet Explorer。

Valid server certificate in Chrome

查看从Chrome获取的屏幕截图。证书似乎有效。我已经创建了自己的证书颁发机构证书(自签名证书),然后我用它来创建我的服务器证书。我填写了主题名称。作为主题备用名称(SAN),我添加了IP地址。

IE和HttpClient中是否不支持SAN字段内的IP地址字段?如果是这样,是否有其他方法使用IP地址验证服务器证书?

我正在使用dotnet core 2.0。

1 个答案:

答案 0 :(得分:3)

在阅读类似问题时,我发现了以下内容:

  

.NET不直接支持IP地址作为主题备用名称,因为它依赖于Schannel来验证证书中的IP地址。

     

Schannel仅查找" DNS名称="中的https请求中给出的主机名(IP)。证书的领域。因此,如果您可以让CA为您提供证书,其中包含" DNS名称="中列出的IP地址。然后它可能会起作用。

您可以尝试使用' DNS名称'字段。

来源:Does .NET web service client support SSL cert with IP in Alternate Subject Name