如何指定服务器IP地址而非DNS来进行HTTP请求

4

我想要的是什么:

为了避免本地DNS查询,需要指定NSMutableURLRequest的服务器IP。

常用方法:

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

request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:@"https://1.1.1.1/path"]];
[request setValue:@"www.a.com" forHTTPHeaderField:@"host"];
问题
如果我的服务器服务于多个域名,则服务器将为我的请求返回默认证书。只有在url中找到主机时,SNI才起作用。
那么在问题场景下,我想实现我想要的,有什么建议呢?

如果您想在HTTPS://12.34.56.78上提供页面,则需要为12.34.56.78获取证书。主机标头只需要与证书上的匹配即可。 - Michael B
@MichaelB-AzureMVP,我想在https://www.a.com/path上提供一个页面,但我必须在客户端指定www.a.com的IP地址(假设我事先知道它),而不是使用DNS。我该如何处理这种情况? - Ryan
你解决了这个问题吗?我有同样的问题,但是我还没有找到解决方案。你能帮我一个忙吗? - zylenv
1个回答

0

实际上,Host头用于确定证书。服务器从未看到完整的URL。如果URL包含IP地址,则NSURLSession和其它相关类通常不会覆盖用户指定的Host头。但是,在“Host”中应该使用大写字母H。因为该头部在您不应该触摸的头部列表中,所以大小写可能很重要。

如果修复大小写无效,则可以考虑以下几种方法:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接