HttpClient and SSL/TLS implementation selector for iOS/macOS (Селектор реализации HttpClient и SSL/TLS для iOS и macOS)
Селектор реализации HttpClient для Xamarin.iOS, Xamarin.tvOS и Xamarin.Mac определяет, какую HttpClient
реализацию следует использовать. Вы можете переключиться на реализацию, которая использует собственные транспорты iOS, tvOS или macOS (NSUrlSession
или CFNetwork
в зависимости от ОС). Это поддержка TLS 1.2, небольшие двоичные файлы и более быстрые загрузки; Недостатком является то, что для выполнения асинхронных операций требуется цикл событий.
Проекты должны ссылаться на сборку System.Net.Http .
Предупреждение
Апрель 2018 г. — из-за повышенных требований к безопасности, включая соответствие PCI, крупные поставщики облачных и веб-серверов, как ожидается, перестают поддерживать версии TLS старше 1.2. Проекты Xamarin, созданные в предыдущих версиях Visual Studio по умолчанию, используют более старые версии TLS.
Чтобы ваши приложения продолжали работать с этими серверами и службами, следует обновить проекты Xamarin, используя приведенный NSUrlSession
ниже параметр, а затем повторно создать и повторно развернуть приложения для пользователей.
Выбор стека HttpClient
Чтобы настроить используемое приложением HttpClient
, выполните следующие действия.
- Дважды щелкните имя проекта в Обозреватель решений, чтобы открыть параметры проекта.
- Перейдите к параметрам сборки проекта (например, сборка iOS для приложения Xamarin.iOS).
- В раскрывающемся списке реализации HttpClient выберите
HttpClient
тип как один из следующих вариантов: NSUrlSession (рекомендуется), CFNetwork или Managed.
Совет
Для поддержки NSUrlSession
TLS 1.2 рекомендуется использовать этот параметр.
NSUrlSession
Обработчик NSURLSession
на основе платформы основан на собственной NSURLSession
платформе, доступной в iOS 7 и более поздней версии.
Это рекомендуемый параметр.
Плюсы
- В нем используются собственные API для повышения производительности и меньшего размера исполняемого файла.
- Поддержка последних стандартов, таких как TLS 1.2.
Минусы
- Требуется iOS 7 или более поздней версии.
- Некоторые
HttpClient
функции и параметры недоступны.
CFNetwork
Обработчик CFNetwork
на основе баз данных основан на собственной CFNetwork
платформе, доступной в iOS 6 и более поздней версии.
Плюсы
- В нем используются собственные API для повышения производительности и меньшего размера исполняемого файла.
- Поддержка новых стандартов, таких как TLS 1.2.
Минусы
- Требуется iOS 6 или более поздней версии.
- Недоступно в watchOS.
- Некоторые функции и параметры HttpClient недоступны.
Управляется
Управляемый обработчик — это полностью управляемый обработчик HttpClient, который был отправлен с предыдущей версией Xamarin.
Плюсы
- Он имеет наиболее совместимый набор функций с Microsoft .NET и более старыми версиями Xamarin.
Минусы
- Она не полностью интегрирована с оси Apple OSes и ограничена TLS 1.0. В будущем он не сможет подключиться к защищенным веб-серверам или облачным службам.
- Обычно это гораздо медленнее при шифровании, чем собственные API.
- Для этого требуется более управляемый код, поэтому создается более крупный распространяемый файл приложения.
Программное задание HttpMessageHandler
Помимо приведенной выше конфигурации на уровне проекта, можно также создать экземпляр HttpClient
и внедрить нужный HttpMessageHandler
конструктор, как показано в этих фрагментах кода:
// This will use the default message handler for the application; as
// set in the Project Options for the project.
HttpClient client = new HttpClient();
// This will create an HttpClient that explicitly uses the CFNetworkHandler
HttpClient client = new HttpClient(new CFNetworkHandler());
// This will create an HttpClient that explicitly uses NSUrlSessionHandler
HttpClient client = new HttpClient(new NSUrlSessionHandler());
Это позволяет использовать другое HttpMessageHandler
значение, отличное от объявленного в диалоговом окне "Параметры проекта".
Реализация SSL/TLS
SSL (безопасный слой сокетов) и его преемник TLS (транспортная безопасность) обеспечивают поддержку HTTP и других сетевых подключений через System.Net.Security.SslStream
. Реализация Xamarin.iOS, Xamarin.tvOS или Xamarin.Mac System.Net.Security.SslStream
вызывает собственную реализацию SSL/TLS Apple вместо использования управляемой реализации, предоставленной Mono. Собственная реализация Apple поддерживает TLS 1.2.
Предупреждение
Будущий выпуск Xamarin.Mac 4.8 будет поддерживать только macOS 10.9 или более поздней версии. Предыдущие версии Xamarin.Mac поддерживали macOS 10.7 или более поздней версии, но в этих версиях macOS нет достаточной инфраструктуры TLS для поддержки TLS 1.2. Для macOS 10.7 или macOS 10.8 используйте Xamarin.Mac 4.6 или более ранней версии.
Безопасность транспорта приложения
Безопасность транспорта приложений Apple (ATS) обеспечивает безопасные подключения между интернет-ресурсами (например, сервером серверной части приложения) и приложением. ATS гарантирует, что все интернет-коммуникации соответствуют рекомендациям по безопасному подключению, тем самым предотвращая случайное раскрытие конфиденциальной информации непосредственно через приложение или библиотеку, которую она потребляет.
Так как ATS включен по умолчанию в приложениях, созданных для iOS 9, tvOS 9 и OS X 10.11 (El Capitan) и более новых, все подключения с использованием NSUrlConnection
CFUrl
или NSUrlSession
будут соответствовать требованиям безопасности ATS. Если ваши подключения не соответствуют этим требованиям, они завершаются сбоем с исключением.
На основе выбранных вариантов реализации HttpClient Stack и SSL/TLS может потребоваться внести изменения в приложение, чтобы правильно работать с ATS.
Дополнительные сведения об ATS см. в нашем руководстве по безопасности транспорта приложений.
Известные проблемы
В этом разделе рассматриваются известные проблемы с поддержкой TLS в Xamarin.iOS.
Не удалось загрузить проект с ошибкой "Запрошенное значение AppleTLS не найдено"
Xamarin.iOS 9.8 представил некоторые новые параметры, содержащие CSPROJ-файл для приложения Xamarin.iOS. Эти изменения могут вызвать проблемы при открытии проекта с более ранними версиями Xamarin.iOS. На следующем снимке экрана показан пример сообщения об ошибке, которое может отображаться в этом сценарии:
Эта ошибка вызвана введением MtouchTlsProvider
параметра в файл проекта в Xamarin.iOS 9.8. Если невозможно обновить до Xamarin.iOS 9.8 (или более поздней версии), необходимо вручную изменить приложение CSPROJ-файла , удалить MtouchTlsprovider
элемент и сохранить измененный файл проекта.
Следующий фрагмент кода является примером того, как MtouchTlsProvider
может выглядеть параметр внутри CSPROJ-файла :
<MtouchTlsProvider>Default</MtouchTlsProvider>