2015-02-06 201 views
0

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

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

但是我的问题是SSL over TCP/IP不通过代理服务器。如下所述,iPhone SDK具有kCFStreamPropertySOCKSProxy属性配置NSStream for 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代理连接到服务器并使用定期SSL流量的连接。但我仍然在寻找iPhone的实施。

谢谢

回答

0

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

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

你是什么意思“在套接字上发送数据”你如何建立连接?你可以分享代码吗? – madlymad 2016-03-18 15:17:32