Технические вопросы и ответы QA1727

Кэш сеанса TLS

Q: Я использую NSURLConnection для доступа к двум HTTPS URLs на том же сервере. Я хочу использовать уникальные клиентские идентификационные данные для каждого соединения. Когда я получаю доступ к первому URL, я получаю запрос аутентификации, позволяющий мне предоставлять корректные клиентские идентификационные данные, но когда я тогда получаю доступ к второму URL, я не получаю запросов аутентификации. Как я могу получить запрос аутентификации для этого второго соединения?

A: Я использую NSURLConnection для доступа к двум HTTPS URLs на том же сервере. Я хочу использовать уникальные клиентские идентификационные данные для каждого соединения. Когда я получаю доступ к первому URL, я получаю запрос аутентификации, позволяющий мне предоставлять корректные клиентские идентификационные данные, но когда я тогда получаю доступ к второму URL, я не получаю запросов аутентификации. Как я могу получить запрос аутентификации для этого второго соединения?

При доступе к URL через HTTPS Вы фактически используете HTTP по TLS (Безопасность транспортного уровня, развитие SSL, Уровня защищенных сокетов). Вы не получаете вторую проблему, потому что второе соединение снова использует сеанс TLS, установленный первым. Для понимания этой проблемы необходимо понять что-то о TLS само, и как она реализована на Mac OS X и iOS.

Открытие сеанса TLS является в вычислительном отношении дорогим (потому что оно включает работу с большими асимметричными ключами), таким образом, TLS имеет механизм, чтобы избежать выполнять эту работу для каждого соединения. Соединение TLS может или установить новый сеанс, или оно может попытаться возобновить существующий сеанс, где возобновление существующего сеанса является намного более дешевым, чем запуск нового. Клиент TLS может поэтому повысить производительность путем поддержания кэша существующих сеансов и многократного использования их, когда это является надлежащим.

Базовый код TLS и Mac OS X и iOS, Безопасного Транспорта, поддерживает такой кэш. Этот кэш сеанса TLS реализован независимо в каждом процессе. При большинстве обстоятельств кэш сеанса TLS работает прозрачно для ускорения соединений TLS, но в некоторых случаях он может вызвать проблемы. В этом случае Ваше второе соединение снова использовало сеанс TLS первого соединения, и таким образом у Вас нет возможности предоставить новые клиентские идентификационные данные для второго соединения.

Поскольку кэширование может произойти на различных уровнях в штабеле NSURLConnection, прежде, чем попытаться работать вокруг проблемы кэша сеанса TLS, это - хорошая идея подтвердить, что это - фактически первопричина. Можно сделать это путем использования факта, что записи кэша сеанса TLS сохраняются в течение приблизительно 10 минут. Таким образом, если проблема все еще происходит, когда второе соединение следует за первым соединением на 9 минут, но уходит, если задержка составляет 11 минут, возможности состоят в том, что кэш сеанса TLS виноват.

Нет никакого прямого способа сбросить кэш сеанса TLS (кроме завершить сам процесс), и при этом нет способа сказать NSURLConnection не использовать его (r. 8957312). Единственное разумное обходное решение должно изменить Ваше соединение таким способом, которым второе соединение не поражает (в смысле «удачного обращения в кэш») запись кэша, создаваемую первым соединением. Чтобы сделать это, необходимо понять формат ключа кэша сеанса TLS, используемый NSURLConnection или, более точно, CFSocketStream, лежащий в основе NSURLConnection.

В отсутствие прокси ключ кэша сеанса TLS содержит целевой IP-адрес, целевой порт и целевое имя DNS, например, {131.39.46.209:47873}devforums.apple.com. Следовательно, изменяя IP-адрес, порт или имя DNS вызовет неудачное обращение в кэш сеанса TLS и позволит Вашему второму соединению получать проблемы аутентификации TLS. В то время как маловероятно, что Вы будете в состоянии изменить компонент IP-адреса ключа кэша сеанса TLS, порт и компоненты имени DNS являются потенциальными кандидатами обходного решения. Например:



История версии документа


ДатаПримечания
10.02.2011

Новый документ, описывающий, как кэш сеанса TLS влияет на Подключения HTTPS, которым нужны различные параметры TLS.