Обратите внимание, что могут быть выбраны разные шифры - я решил использовать тот же, что и наша реализация Windows для согласованности.
С информацией из другого вопроса , упомянутого выше, я выяснил, как настроить шифр для CFSocket, чтобы он использовался так же, как Windows, и код теперь выглядит немного лучше - как будто он действительно работает ! CFSocket напрямую не раскрывает поддержку SecureTransport, что усложняет этот вид, но определение конкретного ключа делает его работоспособным.
Для потомков вот код, который я добавил в -onSocketWillConnect: в нашем классе HTTPConnection:
// define this value; it isn't exposed by CFSocketStream.h
const extern CFStringRef kCFStreamPropertySocketSSLContext;
...
CFReadStreamRef stream = [sock getCFReadStream];
CFDataRef data = (CFDataRef) CFReadStreamCopyProperty(stream, kCFStreamPropertySocketSSLContext);
// Extract the SSLContextRef from the CFData
SSLContextRef sslContext;
CFDataGetBytes(data, CFRangeMake(0, sizeof(SSLContextRef)), (UInt8*)&sslContext);
SSLCipherSuite *ciphers = (SSLCipherSuite *)malloc(1 * sizeof(SSLCipherSuite));
ciphers[0] = SSL_RSA_WITH_RC4_128_MD5; // Basic cipher - not Diffie-Hellman
SSLSetEnabledCiphers(sslContext, ciphers, 1);
Надеюсь, это поможет всем, кто работает с той же проблемой, что и я, - я был бы рад поделиться с вами еще несколькими кодами и советами.