我正在編寫一個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的怪癖真的很不好。