Реализация HTTP-прокси через SSL с использованием метода CONNECT из приложений iPhone

Я работаю над клиент-серверным решением, в котором мое приложение для iPhone подключается к серверу через TCP / IP с использованием SSL-соединения. Я хочу убедиться, что весь трафик SSL проходит через прокси-сервер HTTP.

Мы можем указать информацию о HTTP-прокси на iPhone в «Настройки» -> «Сведения о Wi-Fi» -> «HTTP-прокси» (Вручную / Авто). Когда мы это делаем, весь HTTP-трафик проходит через вышеупомянутый прокси-сервер. (например, весь трафик сафари, даже HTTP-трафик от всех приложений.)

Но моя проблема в том, что SSL через TCP / IP не проходит через прокси-сервер. В iPhone SDK есть набор свойств kCFStreamPropertySOCKSProxy для настройки NSStream для использования SOCKS, как указано ниже, но я не вижу возможности для настройки прокси-сервера HTTP на CFSocket / NSStream. Как лучше всего с этим справиться.

 CFReadStreamRef readStream;
 CFWriteStreamRef writeStream;
 CFStreamCreatePairWithSocketToHost(kCFAllocatorDefault, (CFStringRef)ipAddress, port, &readStream, &writeStream);
 CFDictionaryRef proxyDict = CFNetworkCopySystemProxySettings();
 CFMutableDictionaryRef socksConfig = CFDictionaryCreateMutableCopy(NULL, 0, proxyDict);
 CFDictionarySetValue(socksConfig, kCFStreamPropertySOCKSProxyHost, (CFStringRef)@"proxy-ip");
 CFDictionarySetValue(socksConfig, kCFStreamPropertySOCKSProxyPort, (__bridge CFNumberRef)[NSNumber numberWithInteger:proxy-port]);
 CFDictionarySetValue(socksConfig, kCFStreamPropertySOCKSVersion, kCFStreamSocketSOCKSVersion5);
 CFDictionarySetValue(socksConfig, NSStreamSOCKSProxyUserKey, (CFStringRef)@"proxy-username");
 CFDictionarySetValue(socksConfig, NSStreamSOCKSProxyPasswordKey, (CFStringRef)@"proxy-password");
 CFReadStreamSetProperty(readStream, kCFStreamPropertySOCKSProxy, socksConfig);
 CFWriteStreamSetProperty(writeStream, kCFStreamPropertySOCKSProxy, socksConfig);
 CFRelease(proxyDict);

ОБНОВЛЕНИЕ: похоже, есть только один способ сделать это: выполнить HTTP CONNECT через прокси-сервер к серверу и использовать соединение для обычного трафика SSL. Но все еще ищу реализацию для iPhone.

Спасибо


person Trident    schedule 06.02.2015    source источник


Ответы (1)


Я наконец нашел ответ. Отправьте следующие данные в сокет и используйте тот же сокет для создания TCP-соединения.

 [[NSString stringWithFormat:@"CONNECT %@:%d HTTP/1.1\nProxy-Connection: Keep-Alive\n\n", @"10.10.10.10", 80] dataUsingEncoding:NSUTF8StringEncoding] ;
person Trident    schedule 17.02.2015
comment
Что вы имеете в виду, говоря «Отправить данные в сокет», как вы установили соединение? можешь поделиться кодом? - person madlymad; 18.03.2016
comment
Где я могу использовать эти данные? - person iThanh; 22.10.2020