Поделиться через


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 , выполните следующие действия.

  1. Дважды щелкните имя проекта в Обозреватель решений, чтобы открыть параметры проекта.
  2. Перейдите к параметрам сборки проекта (например, сборка iOS для приложения Xamarin.iOS).
  3. В раскрывающемся списке реализации HttpClient выберите HttpClient тип как один из следующих вариантов: NSUrlSession (рекомендуется), CFNetwork или Managed.

Choose HttpClient implementation from Managed, CFNetwork, or NSUrlSession

Совет

Для поддержки 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) и более новых, все подключения с использованием NSUrlConnectionCFUrl или NSUrlSession будут соответствовать требованиям безопасности ATS. Если ваши подключения не соответствуют этим требованиям, они завершаются сбоем с исключением.

На основе выбранных вариантов реализации HttpClient Stack и SSL/TLS может потребоваться внести изменения в приложение, чтобы правильно работать с ATS.

Дополнительные сведения об ATS см. в нашем руководстве по безопасности транспорта приложений.

Известные проблемы

В этом разделе рассматриваются известные проблемы с поддержкой TLS в Xamarin.iOS.

Не удалось загрузить проект с ошибкой "Запрошенное значение AppleTLS не найдено"

Xamarin.iOS 9.8 представил некоторые новые параметры, содержащие CSPROJ-файл для приложения Xamarin.iOS. Эти изменения могут вызвать проблемы при открытии проекта с более ранними версиями Xamarin.iOS. На следующем снимке экрана показан пример сообщения об ошибке, которое может отображаться в этом сценарии:

Screenshot of error while trying to load project, requested value legacy not found

Эта ошибка вызвана введением MtouchTlsProvider параметра в файл проекта в Xamarin.iOS 9.8. Если невозможно обновить до Xamarin.iOS 9.8 (или более поздней версии), необходимо вручную изменить приложение CSPROJ-файла , удалить MtouchTlsprovider элемент и сохранить измененный файл проекта.

Следующий фрагмент кода является примером того, как MtouchTlsProvider может выглядеть параметр внутри CSPROJ-файла :

<MtouchTlsProvider>Default</MtouchTlsProvider>