【问题标题】:How to specify server IP for a HTTP request instead of DNS如何为 HTTP 请求而不是 DNS 指定服务器 IP
【发布时间】:2016-04-23 17:13:09
【问题描述】:

我想要什么

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

常用方法

替换 URL 中的 host 字段并指定 HTTP 请求的 HOST Header 字段。

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

问题

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

如果我想在问题场景中实现我想要的,有什么建议。

【问题讨论】:

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

标签: ios networking dns nsurlconnection sni


【解决方案1】:

实际上 Host 标头用于确定证书。服务器永远不会看到完整的 URL。如果 URL 包含 IP 地址,IIRC、NSURLSession 和朋友通常不会覆盖用户指定的主机头。但是,它应该是“Host”中的大写“H”。因为该标题 在您不应该触摸的标题列表中,所以大写可能很重要。

如果固定大小写不起作用,您可以考虑其他几种方法:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-20
    • 1970-01-01
    • 1970-01-01
    • 2015-01-25
    • 2018-01-11
    • 1970-01-01
    • 1970-01-01
    • 2012-12-30
    相关资源
    最近更新 更多