Ios 如何为HTTP请求而不是DNS指定服务器IP

Ios 如何为HTTP请求而不是DNS指定服务器IP,ios,networking,dns,nsurlconnection,sni,Ios,Networking,Dns,Nsurlconnection,Sni,我想要什么: 为NSMutableURLRequest指定服务器IP以避免本地DNS查询 常用方法: 替换URL中的主机字段,并指定HTTP请求的主机头字段 request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:@"https://1.1.1.1/path"]]; [request setValue:@"www.a.com" forHTTPHeaderField:@"host"]; 问题: 如果我的服务器

我想要什么

为NSMutableURLRequest指定服务器IP以避免本地DNS查询

常用方法

替换URL中的主机字段,并指定HTTP请求的主机头字段

request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:@"https://1.1.1.1/path"]];
[request setValue:@"www.a.com" forHTTPHeaderField:@"host"];
问题

如果我的服务器服务于多个域,那么服务器将为我的请求返回一个默认证书。SNI只有在url中找到主机时才起作用


因此,如果我想在问题场景中实现我想要的任何建议。

实际上,主机头用于确定证书。服务器从未看到完整的URL。如果URL包含IP地址,IIRC、NSURLSession和friends通常不会覆盖用户指定的主机头。但是,它应该是“主机”中的大写字母“H”。由于该标题位于不应触摸的标题列表中,因此大小写可能很重要

如果固定资本化不起作用,您可以考虑以下几种其他方法:

  • 在不同的头字段中添加主机名,然后使用自定义身份验证处理委托方法亲自针对该证书的域显式验证证书,如果它验证了,则它是您的一个证书它是您的一个域,即使证书的域与请求的域不匹配,也允许请求继续
  • 在应用程序中包含基本代理,并将会话配置为在按名称连接到该主机时始终使用它。在代理中,打开一个到正确IP地址的正常TCP/IP NSStream,并来回传递数据
  • 编写一个定制的HTTPS客户端,它只支持足够的功能来处理您正在做的任何事情

如果要在上提供页面,则需要12.34.56.78的证书,主机标题只需与上的内容匹配即可certificate@MichaelB-AzureMVP我想在上提供一个页面,但我必须在客户端指定www.a.com的IP(假设我事先知道),而不是DNS。我该如何处理这种情况?你解决问题了吗?我有同样的问题,但我还没有找到解决办法。你能帮我个忙吗?