使用来自 iPhone 个应用程序的 CONNECT 方法通过 SSL 实现 HTTP 代理

Implementing HTTP proxy over SSL using CONNECT method from iPhone Applications

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

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

但我的问题是 TCP/IP 上的 SSL 没有通过代理服务器。 iPhone SDK 具有 kCFStreamPropertySOCKSProxy 属性集,用于为 SOCKS 使用配置 NSStream,如下所述,但我没有在 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 实现。

谢谢

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

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