gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 14:05:10 24 4
gpt4 key购买 nike

我正在编写一个 iOS 应用程序,它访问我们自己的网络服务器之一以利用数据。 IIS Web 服务器可公开访问,具有有效的加密证书,并使用 TLS 1.2。据我所知,所有这一切都与应用程序传输安全有关。在应用程序中发出 Web 请求时,请求超时,但更有趣的是,此消息被记录为“NSURLSession/NSURLConnection HTTP 加载失败(kCFStreamErrorDomainSSL,-9806)”。

此 IIS 服务器恰好为不涉及移动应用程序的单独用例接受 X509 客户端证书。将设置更改为忽略 会导致 iOS 应用正常访问服务器。我假设发生超时是因为服务器正在提示应用程序提供客户端证书并且它不只是响应它没有客户端证书。请注意,我没有将客户端证书设置为需要。我不确定如何让 iOS 应用程序正常运行并在服务器提示客户端证书时继续运行。

有没有办法让它在 iOS 中工作,同时允许 IIS 服务器仍然接受客户端证书?我不想通过向 info.plist 添加 hacky 排除来减少 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 怪癖而改变服务器行为真的很 hacky。

最佳答案

您可以尝试更改 iOS build设置吗。

  1. 更改 SSL/TLS 工具使用 * Apple TLS *
  2. 更改 HttpClient 实现使用 * NSUrlSession *

我有类似的问题,使用 HttpClient 调用我们的公共(public) Https API,上面的设置解决了这个问题。

关于ios - 在 iOS 中向接受客户端证书的 Web 服务器发出 Web 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43460617/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com