2015-02-06 104 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