2016-04-23 12 views
3

Я хочу:Как указать IP-сервер для запроса HTTP вместо DNS

Укажите IP-адрес сервера для NSMutableURLRequest, чтобы избежать localDNS запроса.

Обычный метод:

Заменить поле хоста в URL и указать поле заголовка HOST для запроса HTTP.

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

Проблема:

Если мой сервер обслуживает несколько доменов, то сервер возвращает сертификат по умолчанию для моего запроса. SNI работает только тогда, когда находит узел в URL-адресе.

Таким образом, любое предложение, если я хочу достичь Я хочу в Проблема сцены.

+0

, если вы хотите, чтобы служить страницу в HTTPS://12.34.56.78 то вам нужен сертификат для 12.34.56.78 заголовок узла просто необходимо, чтобы соответствовать тому, что находится в на сертификате –

+0

@ MichaelB-AzureMVP Я хочу служить страницу по адресу https://www.a.com/path, но я должен указать IP (предположим, что знаю это заранее) для www.a.com на стороне клиента вместо DNS. Как я могу справиться с этой ситуацией. – Ryan

+0

Вы решили проблему? У меня такой же вопрос, но я пока не нашел решения. Можете ли вы оказать мне услугу? – zylenv

ответ

0

Фактически заголовок узла используется для определения сертификата. Сервер никогда не видит полный URL. IIRC, NSURLSession и друзья обычно не переопределяют указанный в заголовке узла Host, если URL-адрес содержит IP-адрес. Тем не менее, он должен быть капиталом «H» в «Host». Поскольку этот заголовок равен в списке заголовков, которые вы не должны касаться, капитализация может иметь значение.

Если фиксируя капитализации не работает, есть несколько других подходов можно рассмотреть следующие вопросы:

  • Добавьте имя хоста в другом поле заголовка, а затем использовать пользовательскую аутентификацию обработки метод делегата явно проверки сертификат в этом домене сертификата, и если он проверяет и, он является одним из ваших сертификатов и для одного из ваших доменов, разрешите продолжить запрос, даже если домен сертификата не соответствует домену запроса.
  • Включите прокси-сервер в своем приложении и настройте сеанс, чтобы всегда использовать его при подключении к этому узлу по имени. В прокси-сервере откройте обычный TCP/IP NSStream на правильный IP-адрес и передайте данные взад и вперед.
  • Напишите пользовательский клиент HTTPS, который поддерживает только достаточную функциональность, чтобы обрабатывать все, что вы делаете.