在iOS中向接受客户端证书的Web服务器发出Web请求

在iOS中向接受客户端证书的Web服务器发出Web请求,ios,ssl,iis,xamarin,client-certificates,Ios,Ssl,Iis,Xamarin,Client Certificates,我正在编写一个iOS应用程序,它可以点击我们自己的一个web服务器来利用数据。IIS web服务器可公开访问,具有有效的加密证书,并使用TLS 1.2。据我所知,所有这些都取决于应用程序传输安全。在应用程序中发出web请求时,请求超时,但更有趣的是,此消息记录为“NSURLSession/NSURLConnection HTTP load failed(kCFStreamErrorDomainSSL,-9806)” 此IIS服务器碰巧接受不涉及移动应用程序的单独用例的X509客户端证书。将设置更

我正在编写一个iOS应用程序,它可以点击我们自己的一个web服务器来利用数据。IIS web服务器可公开访问,具有有效的加密证书,并使用TLS 1.2。据我所知,所有这些都取决于应用程序传输安全。在应用程序中发出web请求时,请求超时,但更有趣的是,此消息记录为“NSURLSession/NSURLConnection HTTP load failed(kCFStreamErrorDomainSSL,-9806)”

此IIS服务器碰巧接受不涉及移动应用程序的单独用例的X509客户端证书。将设置更改为“忽略”(Ignore)将导致iOS应用程序正常运行。我假设发生超时是因为服务器提示应用程序获取客户端证书,而它不会只是响应没有客户端证书。注意,我没有将客户端证书设置为需要。我不知道如何让iOS应用程序运行良好,并在服务器提示获取客户端证书时继续运行

有没有办法让它在iOS中工作,同时允许IIS服务器仍然接受客户端证书?我不想通过在info.plist中添加黑客排除来减少ATS

我不认为这有什么关系,但我正在C#中的Xamarin.iOS中开发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怪癖而改变服务器的行为真的很不容易。

你能试着改变iOS的构建设置吗

  • 更改SSL/TLS实施使用*苹果TLS*
  • 更改HttpClient实现使用*NSUrlSession*
  • 我也有类似的问题,使用HttpClient调用我们的公共Https API,上面的设置修复了这个问题