连接后(连接到 FTP,首先没有 SSL)我运行:

NSArray *objects = [NSArray arrayWithObjects:@"proxy.ip", [NSNumber numberWithInt:1080], NSStreamSOCKSProxyVersion5, @"user", @"pass", nil];
NSArray *keys = [NSArray arrayWithObjects:NSStreamSOCKSProxyHostKey, NSStreamSOCKSProxyPortKey, NSStreamSOCKSProxyVersionKey, NSStreamSOCKSProxyUserKey, NSStreamSOCKSProxyPasswordKey, nil];
NSDictionary *proxyDictionary = [NSDictionary dictionaryWithObjects:objects forKeys:keys];

[iStream retain];
[iStream setDelegate:self];
[iStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[iStream setProperty:proxyDictionary forKey:NSStreamSOCKSProxyConfigurationKey];
[iStream open];

iStream 也一样。这允许我通过socks5代理成功连接。如果我在没有 setProperty:proxyDictionary 的情况下继续...(socks5 已禁用)我会告诉服务器切换到 SSL,然后成功地将这些设置应用到输入/输出流,从而给我一个 SSL 连接:

NSMutableDictionary *settings = [NSMutableDictionary dictionaryWithCapacity:1];
[settings setObject:(NSString *)NSStreamSocketSecurityLevelTLSv1 forKey:(NSString *)kCFStreamSSLLevel];
// to allow selfsigned certificates:
[settings setObject:[NSNumber numberWithBool:YES] forKey:(NSString *)kCFStreamSSLAllowsAnyRoot];
[iStream retain];   
[iStream setDelegate:self];
[iStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
CFReadStreamSetProperty((CFReadStreamRef)iStream, kCFStreamPropertySSLSettings, (CFTypeRef)settings);
//[iStream setProperty:NSStreamSocketSecurityLevelTLSv1 forKey:NSStreamSocketSecurityLevelKey]; <-- needs to be default or unset, then it works.

oStream 也一样。如果我禁用socks5,所有这些都可以正常工作。如果我打开它(第一个片段中的第 7 行),我会在应用 SSL 设置时失去联系。

如果我不得不猜测,我认为应用(ssl)“设置”时它会丢失一些属性?

请帮忙 :)

  • 埃文
有帮助吗?

解决方案

解决方案是在 NSStream SSL 连接问题, ,我不应该设置安全级别。我已将上面的帖子编辑为可行的解决方案。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top