Aracılığıyla paylaş


iOS/macOS için HttpClient ve SSL/TLS uygulama seçicisi

Xamarin.iOS, Xamarin.tvOS ve Xamarin.Mac için HttpClient Uygulama Seçicisi hangi HttpClient uygulamanın kullanılacağını denetler. İşletim sistemine bağlı olarak iOS, tvOS veya macOS yerel aktarımlarını (NSUrlSession veya CFNetwork) kullanan bir uygulamaya geçebilirsiniz. Bunun iyi tarafı TLS 1.2 desteği, daha küçük ikili dosyalar ve daha hızlı indirmeler; dezavantajı, zaman uyumsuz işlemlerin yürütülmesi için olay döngüsünün çalıştırılmasını gerektirmesidir.

Projelerin System.Net.Http derlemesine başvurması gerekir.

Uyarı

Nisan 2018 – PCI uyumluluğu da dahil olmak üzere artan güvenlik gereksinimleri nedeniyle, büyük bulut sağlayıcılarının ve web sunucularının 1.2'den eski TLS sürümlerini desteklemeyi durdurması bekleniyor. Visual Studio'nun önceki sürümlerinde oluşturulan Xamarin projeleri varsayılan olarak TLS'nin eski sürümlerini kullanır.

Uygulamalarınızın bu sunucu ve hizmetlerle çalışmaya devam ettiğinden emin olmak için Xamarin projelerinizi aşağıda gösterilen ayar ile NSUrlSession güncelleştirmeli, ardından uygulamalarınızı yeniden oluşturup kullanıcılarınıza yeniden dağıtmalısınız.

HttpClient yığını seçme

Uygulamanız tarafından kullanılan ayarı yapmak HttpClient için:

  1. Proje Seçenekleri'ni açmak için Çözüm Gezgini Proje Adı'na çift tıklayın.
  2. Projenizin Derleme ayarlarına geçin (örneğin, Xamarin.iOS uygulaması için iOS Derlemesi).
  3. HttpClient Uygulaması açılan listesinden HttpClient türü aşağıdakilerden biri olarak seçin: NSUrlSession (önerilir), CFNetwork veya Managed.

Choose HttpClient implementation from Managed, CFNetwork, or NSUrlSession

İpucu

TLS 1.2 desteği için NSUrlSession seçeneği önerilir.

NSUrlSession

NSURLSessionTabanlı işleyici, iOS 7 ve daha yeni sürümlerde kullanılabilen yerel NSURLSession çerçeveyi temel alır. Önerilen ayar budur.

Avantajlar

  • Daha iyi performans ve daha küçük yürütülebilir boyut için yerel API'ler kullanır.
  • TLS 1.2 gibi en son standartlar için destek.

Dezavantajlar

  • iOS 7 veya sonraki bir sürümü gerektirir.
  • Bazı HttpClient özellikler/seçenekler kullanılamaz.

CFNetwork

CFNetworkTabanlı işleyici, iOS 6 ve daha yeni sürümlerde kullanılabilen yerel CFNetwork çerçeveyi temel alır.

Avantajlar

  • Daha iyi performans ve daha küçük yürütülebilir boyut için yerel API'ler kullanır.
  • TLS 1.2 gibi daha yeni standartlar için destek.

Dezavantajlar

  • iOS 6 veya üzerini gerektirir.
  • watchOS'ta kullanılamaz.
  • Bazı HttpClient özellikleri/seçenekleri kullanılamaz.

Yönetilen

Yönetilen işleyici, Xamarin'in önceki sürümüyle birlikte gönderilen tam olarak yönetilen HttpClient işleyicisidir.

Avantajlar

  • Microsoft .NET ve eski Xamarin sürümleriyle en uyumlu özellik kümesine sahiptir.

Dezavantajlar

  • Apple işletim sistemiyle tam olarak entegre değildir ve TLS 1.0 ile sınırlıdır. Gelecekte güvenli web sunucularına veya bulut hizmetlerine bağlanamayabilir.
  • Şifreleme gibi durumlarda genellikle yerel API'lerden çok daha yavaştır.
  • Daha fazla yönetilen kod gerektirir, bu nedenle dağıtılabilir daha büyük bir uygulama oluşturur.

HttpMessageHandler'ın program aracılığıyla ayarlanması

Yukarıda gösterilen proje genelinde yapılandırmaya ek olarak, aşağıdaki kod parçacıklarında gösterildiği gibi bir HttpClient örneği oluşturabilir ve oluşturucu aracılığıyla isteneni HttpMessageHandler ekleyebilirsiniz:

// 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());

Bu, Proje Seçenekleri iletişim kutusunda bildirilenden farklı HttpMessageHandler bir kullanılmasına olanak sağlar.

SSL/TLS uygulaması

SSL (Güvenli Yuva Katmanı) ve ardılı TLS (Aktarım Katmanı Güvenliği), aracılığıyla System.Net.Security.SslStreamHTTP ve diğer ağ bağlantıları için destek sağlar. Xamarin.iOS, Xamarin.tvOS veya Xamarin.Mac'in System.Net.Security.SslStream uygulaması, Mono tarafından sağlanan yönetilen uygulamayı kullanmak yerine Apple'ın yerel SSL/TLS uygulamasını çağırır. Apple'ın yerel uygulaması TLS 1.2'i destekler.

Uyarı

Yaklaşan Xamarin.Mac 4.8 sürümü yalnızca macOS 10.9 veya sonraki sürümleri destekleyecektir. Xamarin.Mac’in önceki sürümleri macOS 10.7 veya sonraki sürümleri destekler ancak bu eski macOS sürümleri TLS 1.2’yi destekleyecek yeterli TLS altyapısını barındırmaz. macOS 10.7 veya macOS 10.8’i hedeflemek için Xamarin.Mac 4.6 veya önceki sürümleri kullanın.

Uygulama Aktarım Güvenliği

Apple'ın App Transport Security (ATS), İnternet kaynakları (uygulamanın arka uç sunucusu gibi) ile uygulamanız arasında güvenli bağlantılar zorlar. ATS, tüm internet iletişimlerinin güvenli bağlantı en iyi yöntemlerine uygun olmasını sağlayarak hassas bilgilerin doğrudan uygulamanız veya kullanmakta olduğu bir kitaplık aracılığıyla yanlışlıkla açıklanmasını önler.

ATS, iOS 9, tvOS 9 ve OS X 10.11 (El Capitan) ve daha yeni sürümler için oluşturulan uygulamalarda varsayılan olarak etkinleştirildiğinden, veya CFUrl NSUrlSession kullanan NSUrlConnectiontüm bağlantılar ATS güvenlik gereksinimlerine tabi olacaktır. Bağlantılarınız bu gereksinimleri karşılamıyorsa, bir özel durumla başarısız olur.

HttpClient Stack ve SSL/TLS Uygulama seçimlerinize bağlı olarak, ATS ile doğru şekilde çalışmak için uygulamanızda değişiklikler yapmanız gerekebilir.

ATS hakkında daha fazla bilgi edinmek için lütfen App Transport Security kılavuzumuza bakın.

Bilinen sorunlar

Bu bölümde Xamarin.iOS'ta TLS desteğiyle ilgili bilinen sorunlar ele alınacaktır.

Project yüklenemedi ve "İstenen değer AppleTLS bulunamadı" hatasıyla başarısız oldu

Xamarin.iOS 9.8, Xamarin.iOS uygulaması için .csproj dosyasını içeren bazı yeni ayarlar kullanıma sunulmuştur. Proje Xamarin.iOS'un eski sürümleriyle açıldığında bu değişiklikler sorunlara neden olabilir. Aşağıdaki ekran görüntüsü, bu senaryoda görüntülenebilir hata iletisinin bir örneğidir:

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

Bu hata, ayarın MtouchTlsProvider Xamarin.iOS 9.8'deki proje dosyasına eklenmesinden kaynaklanır. Xamarin.iOS 9.8 (veya üzeri) sürümüne güncelleştirmek mümkün değilse, geçici çözüm .csproj dosya uygulamasını el ile düzenlemek, öğesini kaldırmak MtouchTlsprovider ve ardından değiştirilen proje dosyasını kaydetmektir.

Aşağıdaki kod parçacığı, .csproj dosyasının içinde ayarın MtouchTlsProvider nasıl görünebileceğini gösteren bir örnektir:

<MtouchTlsProvider>Default</MtouchTlsProvider>