Как каждый устанавливает шифры SSL при использовании CFSocket/CFStream в Какао?

Я недавно должен был настроить CocoaHttpServer, который мы используем в нашем приложении с успехом, для обработки Подключений HTTPS, прибывающих из клиентского приложения (работающий на устройствах на базе Android). Это прекрасно - существует обильный пример кода, который допускает это, и мы смогли включить защищенный сервер без проблемы.

На практике мы видели невероятно длинные стадии переговоров SSL, в то время как клиент делал его квитирование с нашим сервером - вверх 70 секунд.

Через длинный ряд поисков я нашел, что задержка была из-за вычисления параметров Diffie-Hellman, используемых по умолчанию, когда SSL включен в CFSocket. Этот поток - то, где я сначала начал находить ответ на свою проблему.

Для соответствия, что делал наш Windows Server (использование менее - защищают шифр SSL), я должен был установить шифр явно на Mac, который не легок при использовании AsyncSocket в качестве обертки для связей с сокетом.

Наш Windows Server использовал: TLS_RSA_WITH_RC4_128_MD5) (0x04) RC4 MD5 RSA на 128 битов

Наш сервер Macintosh использовал: TLS_DHE_RSA_WITH_AES_256_CBC_SHA (0x039) SHA-1 AES 256 битов Эфемерный Обмен ключами Диффи-Хеллмана с помощью сертификата RSA

Различия в "безопасности" являются значительными, но вероятно не стоят усилия/вычисления/задержки, которое мы видели. Театр безопасности?

8
задан Hosch250 2 November 2014 в 05:03
поделиться

2 ответа

Пожалуйста, обратите внимание, что существуют различные шифры, которые можно выбрать - для согласованности я выбрал тот же самый шифр, что и наша реализация 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);

Надеюсь, это поможет любому, кто работает над той же проблемой, что и я - я буду рад поделиться еще кодом и советом, если понадобится

.
4
ответ дан 6 December 2019 в 00:07
поделиться

Как бы то ни было, я внес патч в CocoaAsyncSocket примерно за неделю до того, как у вас возникла эта проблема. Извините, что тогда я не заметил вашего вопроса. : -)

0
ответ дан 6 December 2019 в 00:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: