2017-04-17 26 views
0

我正在編寫一個iOS應用程序,它可以訪問我們自己的Web服務器之一以利用數據。 IIS Web服務器可公開訪問,具有有效的加密證書,並使用TLS 1.2。據我所知,所有這一切都是爲了減少App Transport Security。在應用程序中發出Web請求時,請求超時,但更有趣的是,此消息被記錄爲「NSURLSession/NSURLConnection HTTP加載失敗(kCFStreamErrorDomainSSL,-9806)」。將iOS中的Web請求發送到接受客戶端證書的Web服務器

此IIS服務器碰巧接受 X509客戶端證書用於不涉及移動應用程序的單獨用例。更改設置爲忽略導致iOS應用程序擊中服務器正常。我假設發生超時是因爲服務器正在提示客戶端證書的應用程序,並且它不僅僅響應它沒有。請注意,我沒有將客戶端證書設置爲需要。我不確定如何讓iOS應用程序很好地播放,並在服務器提示客戶端證書時繼續。

有沒有辦法讓這個在iOS中工作,同時允許IIS服務器仍然接受客戶端證書?我不想通過在info.plist中添加hacky排除來減少ATS。

我不認爲這是相關的,但我正在開發Xamarin.IOS在C#中的iOS應用程序。請求是這樣的:

  using (var client = new WebClient()) 
     { 
      client.Headers.Add(Constants.RequestHeaders.RequestId, nonce.RequestId.ToString()); 
      client.Headers.Add(Constants.RequestHeaders.Signature, Convert.ToBase64String(nonce.DigitalSignature)); 
      client.Headers.Add(HttpRequestHeader.ContentType, "application/json"); 

      var resultJson = client.UploadString("https://foo.com/Api/Register", json); 
     } 

編輯:

我能夠通過使用現有的NuGet庫ModernHttpClient來解決這個問題。 API網站接受客戶端證書,但不需要它們。在大多數瀏覽器中,這會導致瀏覽器一次性提示您要求指定您要使用的證書。但是,在iOS中,默認情況下編寫Web請求不會提示(當然),也不會通知服務器沒有提供證書。因此,請求只是超時。使用ModernHttpClient,我找到了一種設置此行爲以自動解決的方法。

 var handler = new NativeMessageHandler(); 
     handler.ClientCertificateOptions = ClientCertificateOption.Automatic; 
     using (var client = new HttpClient(handler)) 
     { ... 

現在它工作正常。我寧願不必爲了這個特定的目的而包含一個庫,但它可以工作。也許這個特定的功能可以被提煉成幾行代碼而不使用庫?無論如何,我很感謝ModernHttpClient解決這個問題。要改變服務器行爲只是爲了支持iOS的怪癖真的很不好。

回答

1

你可以嘗試更改iOS生成設置。

  1. 變化SSL/TLS實現使用*蘋果TLS *
  2. 變化HttpClient的執行使用* NSUrlSession *

我有類似的問題,使用的HttpClient撥打我們的公衆的Https API,以上設置解決了問題。

相關問題