使用iPhone应用程序中的CONNECT方法在SSL上实现HTTP代理

时间:2015-02-06 17:01:32

标签: iphone ssl tcp-ip proxy-server http-tunneling

我正在研究客户端 - 服务器解决方案,我的iPhone应用程序使用SSL连接通过TCP / IP连接到服务器。我想确保SSL上的整个流量都通过HTTP代理服务器。

我们可以在设置中指定iPhone上的HTTP代理信息 - > WiFi详细信息 - > HTTP代理(手动/自动)。当我们这样做时,所有HTTP流量都通过上面提到的代理服务器。 (例如,所有的Safari流量,甚至来自所有应用的HTTP流量。)

但我的问题是SSL over TCP / IP不通过代理服务器。 iPhone SDK具有kCFStreamPropertySOCKSProxy属性集,用于配置NSStream以进行SOCKS使用,如下所述,但我没有看到在CFSocket / NSStream上配置HTTP代理服务器的规定。处理这个问题的最佳方法是什么。

 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实施。

由于

1 个答案:

答案 0 :(得分:0)

我终于找到了答案。在套接字上发送以下数据并使用相同的套接字创建TCP连接。

 [[NSString stringWithFormat:@"CONNECT %@:%d HTTP/1.1\nProxy-Connection: Keep-Alive\n\n", @"10.10.10.10", 80] dataUsingEncoding:NSUTF8StringEncoding] ;