gpt4 book ai didi

ios - 如何使用 SNI 获取自定义 NSURLProtocol

转载 作者:行者123 更新时间:2023-11-30 12:20:11 24 4
gpt4 key购买 nike

首先是服务器端:有一个内部可访问的 apache 服务器,带有多个虚拟主机。对于 http(无 's'!) 请求,我使用 IP 作为 URL,并在 Host-Header 字段中添加主机名。

效果非常好。

但是当我建立 SSL 连接时,我遇到了似乎与 SNI 相关的问题。

我找到了这个Overriding TLS Chain Validation Correctly并在我的代码中实现了它。

所以我更新了信任

func urlSession(_ session: URLSession, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void)

但我仍然从服务器收到 400。

更新:URLSession 确实支持 SNI,但我的问题是我需要在 SSLHandshake 中添加额外的或更改 主机名

首先是服务器的简短描述:该服务器是一个 Apache 服务器,只能通过 IP 访问,但它有多个虚拟主机,这些虚拟主机可以通过主机名在本地使用,但是当我从 iPhone 等外部设备连接到它们时,我必须在 主机头字段

所以我要做的是:创建一个带有基于 IP 的 URL 的 URLRequest,然后添加带有主机名的 HOST header 字段

if let url = URL("https://192.168.178.54:8890") {
var request = URLRequest(url: url)
request.addValue("foobar:8890", forHTTPHeaderField: "Host")

}

这对于非安全 http 请求来说非常有效,但一旦使用 https,服务器就会返回“400 Bad request”,并且 http-ssl-error.log 包含以下错误:

[Tue Jul 11 09:35:51 2017] [error] Hostname 192.168.178.54 provided via SNI and hostname foobar provided via HTTP are different

这是因为默认情况下 SSLHandshake 使用 URL 中提供的值,在我的例子中,这是 IP。

我现在试图弄清楚如何在 SSLHandshake 中提供不同的主机名,或者提供类似自己的 DNS 解析器之类的东西,我仍然可以在其中使用基于主机名的 URL,但 iOS 可以直接获取路由。

最佳答案

首先我们是如何解决这个问题的:服务器人员终于正确地完成了他们的工作,并且没有搞乱设置。

返回我还在 Apple Dev Forums 中发布了我的问题

我也从我的 TSI 那里收到了这个:

passed your incident to me because I generally take the lead on both NSURLSession and TLS issues here in DTS (I was out of the office when your incident originally came in).

Coming back to your technical issue it seems that I responded to you via the DevForums thread that you created for this.

https://forums.developer.apple.com/thread/82179

That response was rather brief but it did cover the salient points:

  • There’s no way to configure the SNI name at the NSURLSession level

  • My recommended alternative is to use .local DNS names

As noted above my DevForums response was rather brief so if you have any follow up questions about the latter I’d be happy to answer them here.

You /can/ override the SNI name at lower levels in the networking stack, that is, CFSocketStream (accessed via the NSSStream and CFStream APIs) and Secure Transport.  In theory you could implement your own HTTP protocol layer within your NSURLProtocol subclass, using these APIs for the TLS-over-TCP side of things, but I /strongly/ recommend against that because it’s a huge amount of work.

Share and Enjoy -- Quinn "The Eskimo!" Apple Developer Relations, Developer Technical Support, Core OS/Hardware

关于ios - 如何使用 SNI 获取自定义 NSURLProtocol,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44884080/

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