SSL-закрепление на iOS - проблема с кэшированием TLS с NSURLConnection
Я столкнулся с проблемой при реализации закрепления нашего SSL-сертификата в приложении iOS. В настоящее время мы используем NSURLConnection
с делегатом для проверки подлинности. Это все хорошо, и вызывается при первоначальном входе в приложение, гарантируя, что мы подключены к нашему серверу.
Нам известно о кэшировании TLS, где метод закрепления делегата (willSendRequestForAuthenticationChallenge) не вызывается снова в течение 10 минут. На самом деле это не проблема, так как нам нужно только проверить сертификат при входе в систему, хотя чаще это было бы желательно. Мы собрали заявку в службу поддержки Apple и получили ответ, подтверждающий, что кэширование TLS будет означать, что метод закрепления делегата будет вызываться только периодически, но обмен криптографическими ключами предотвратит атаку MITM-прокси между вызовами.
Звучит хорошо, но, похоже, это не так. Вот что мы обнаружили. Если при запуске мы войдем в наше приложение как обычно, вызывается делегат закрепления. Затем мы создаем фоновое приложение и подключаем iPhone к прокси-серверу на MacBook под управлением Burp Suite (сертификат доверия сервера уже установлен на iPhone на данный момент). Если затем мы создаем приложение, выйдем из системы и снова войдем в систему, willSendRequestForAuthenticationChallenge не будет вызван, даже если в этот момент сеанс TLS должен быть недействительным.
Я попытался указать различные политики кэширования по запросу, но, похоже, ничего не изменилось. Я не могу понять, почему делегат не будет вызван снова с добавленным прокси-сервером MITM - любой совет будет высоко ценится.