iOS 应用无法第二次访问安全服务器
iOS app fails second access to secure server
我们有一个 iOS 应用程序可以从我们的安全网络服务器读取信息。在我朋友搬回美国之前,一切都很好。现在他的 phone 只会在应用程序 运行 安装后或从 phone 数据切换到 wifi 后第一次下载数据。该应用程序对我来说每次都能完美运行,而且我在美国境外(就像他移居美国之前对他所做的那样)。他的亲戚也反映了同样的问题。
我们俩都有 iPhone 6 运行ning iOS 10.2。我有开发代码,但他不是开发人员,也没有 macbook,所以我无法直接调试他的 phone。我已经从 Test Flight 下载了该应用程序,以确保我拥有相同的二进制文件。
(仅供参考:我确实解决了一个旧的自签名证书遗留在服务器上导致他出现 SSL 故障问题的问题。我没有 TLS/networking info.plist 条目非豁免加密以外的应用 = 否)
我们的服务器托管在美国,运行s Apache 2.4.18 PHP,并有商业证书。我有 运行 各种证书测试人员,他们都说证书工作完美(甚至在我添加 Forwarding Secrecy 之前)。我已经将 Apache 日志调到 "trace6" 以查看 SSL 在做什么,但他第二次尝试访问服务器(几乎)从未在站点 access.log 或 error.log 中记录任何内容。
偶尔他会在 Apache 站点 error.log 中第二次尝试应用程序时得到这个(我做了一些编辑):
[Sun Jan 29 18:27:48.129214 2017] [ssl:info] [pid 6690] [client 70.211.19.XXX:8740] AH01964: Connection to child 8 established (server (redacted).net:443)
[Sun Jan 29 18:27:48.129312 2017] [ssl:trace2] [pid 6690] ssl_engine_rand.c(126): Seeding PRNG with 656 bytes of entropy
[Sun Jan 29 18:27:48.129354 2017] [ssl:trace3] [pid 6690] ssl_engine_kernel.c(1970): [client 70.211.19.XXX:8740] OpenSSL: Handshake: start
[Sun Jan 29 18:27:48.129365 2017] [ssl:trace3] [pid 6690] ssl_engine_kernel.c(1979): [client 70.211.19.XXX:8740] OpenSSL: Loop: before/accept initialization
[Sun Jan 29 18:27:48.129376 2017] [ssl:trace4] [pid 6690] ssl_engine_io.c(2065): [client 70.211.19.XXX:8740] OpenSSL: I/O error, 11 bytes expected to read on BIO#5566ac3b3e20 [mem: 5566ac3ef790]
[Sun Jan 29 18:27:48.129380 2017] [ssl:trace3] [pid 6690] ssl_engine_kernel.c(2008): [client 70.211.19.XXX:8740] OpenSSL: Exit: error in SSLv2/v3 read client hello A
[Sun Jan 29 18:27:48.129385 2017] [ssl:debug] [pid 6690] ssl_engine_io.c(1227): (70014)End of file found: [client 70.211.19.XXX:8740] AH02007: SSL handshake interrupted by system [Hint: Stop button pressed in browser?!]
[Sun Jan 29 18:27:48.129390 2017] [ssl:info] [pid 6690] [client 70.211.19.XXX:8740] AH01998: Connection closed to child 8 with abortive shutdown (server (redacted).net:443)
这里的一个问题是带有 "OpenSSL: Exit: error in SSLv2/v3 read client hello A" 的行。 TLS 1.2 在服务器上,当然,SSLv3 被禁用——我认为它应该被禁用。
作为测试,我创建了一个测试应用程序来测试 DNS、HTTP 和 HTTPS,他只在 https 页面上收到 404 错误。我可以随心所欲地从我的 phone 访问任何页面——与此同时他收到 404。然后我让他访问 https:\\www.google.com 并且每次都对他有效。然后他尝试了我们的服务器并...即时 404,服务器日志中没有任何内容。
我再说一遍 - 我从来没有任何问题。相同 phone,相同 iOS,相同二进制。
有没有人遇到过这样的事情?
编辑:更新了场景并更正了一些不太正确的信息。
我发现了我的问题,这有点令人尴尬,但如果这对其他人有帮助,那么就开始吧。 404 试图告诉我一些事情。
在我的国家,所有 ISP 仍然是 运行IPv4。我的朋友搬到了美国,那里的一切都是 IPv6。基本上,我没有意外地设置 Apache 以将 IPv6/SSL 配置指向与 IPv4/SSL 相同的 "HTML" 目录 - 因此 404s 是他的而不是我的。但是端口 80 上的 IPv6 配置正确。我无法测试 IPv6,因为它对我不可用。
我在服务器上使用 wget 后想通了。我可以在 index.html 页面上点击,但没有别的。我找到了一个额外的 "html" 目录,因此找到了指向它的 IPv6 配置。日志中没有任何内容,因为它们是错误的日志(翻白眼,感觉像个菜鸟)。
我曾尝试过 IPv6 代理页面,但事实证明它已损坏。即使在我修复了我的站点并且该应用程序可以在 IPv6 上运行后,代理站点仍然会出现 SSL 错误。它可能使用了我已经禁止的过时协议。相当红的鲱鱼。
我们有一个 iOS 应用程序可以从我们的安全网络服务器读取信息。在我朋友搬回美国之前,一切都很好。现在他的 phone 只会在应用程序 运行 安装后或从 phone 数据切换到 wifi 后第一次下载数据。该应用程序对我来说每次都能完美运行,而且我在美国境外(就像他移居美国之前对他所做的那样)。他的亲戚也反映了同样的问题。
我们俩都有 iPhone 6 运行ning iOS 10.2。我有开发代码,但他不是开发人员,也没有 macbook,所以我无法直接调试他的 phone。我已经从 Test Flight 下载了该应用程序,以确保我拥有相同的二进制文件。
(仅供参考:我确实解决了一个旧的自签名证书遗留在服务器上导致他出现 SSL 故障问题的问题。我没有 TLS/networking info.plist 条目非豁免加密以外的应用 = 否)
我们的服务器托管在美国,运行s Apache 2.4.18 PHP,并有商业证书。我有 运行 各种证书测试人员,他们都说证书工作完美(甚至在我添加 Forwarding Secrecy 之前)。我已经将 Apache 日志调到 "trace6" 以查看 SSL 在做什么,但他第二次尝试访问服务器(几乎)从未在站点 access.log 或 error.log 中记录任何内容。
偶尔他会在 Apache 站点 error.log 中第二次尝试应用程序时得到这个(我做了一些编辑):
[Sun Jan 29 18:27:48.129214 2017] [ssl:info] [pid 6690] [client 70.211.19.XXX:8740] AH01964: Connection to child 8 established (server (redacted).net:443)
[Sun Jan 29 18:27:48.129312 2017] [ssl:trace2] [pid 6690] ssl_engine_rand.c(126): Seeding PRNG with 656 bytes of entropy
[Sun Jan 29 18:27:48.129354 2017] [ssl:trace3] [pid 6690] ssl_engine_kernel.c(1970): [client 70.211.19.XXX:8740] OpenSSL: Handshake: start
[Sun Jan 29 18:27:48.129365 2017] [ssl:trace3] [pid 6690] ssl_engine_kernel.c(1979): [client 70.211.19.XXX:8740] OpenSSL: Loop: before/accept initialization
[Sun Jan 29 18:27:48.129376 2017] [ssl:trace4] [pid 6690] ssl_engine_io.c(2065): [client 70.211.19.XXX:8740] OpenSSL: I/O error, 11 bytes expected to read on BIO#5566ac3b3e20 [mem: 5566ac3ef790]
[Sun Jan 29 18:27:48.129380 2017] [ssl:trace3] [pid 6690] ssl_engine_kernel.c(2008): [client 70.211.19.XXX:8740] OpenSSL: Exit: error in SSLv2/v3 read client hello A
[Sun Jan 29 18:27:48.129385 2017] [ssl:debug] [pid 6690] ssl_engine_io.c(1227): (70014)End of file found: [client 70.211.19.XXX:8740] AH02007: SSL handshake interrupted by system [Hint: Stop button pressed in browser?!]
[Sun Jan 29 18:27:48.129390 2017] [ssl:info] [pid 6690] [client 70.211.19.XXX:8740] AH01998: Connection closed to child 8 with abortive shutdown (server (redacted).net:443)
这里的一个问题是带有 "OpenSSL: Exit: error in SSLv2/v3 read client hello A" 的行。 TLS 1.2 在服务器上,当然,SSLv3 被禁用——我认为它应该被禁用。
作为测试,我创建了一个测试应用程序来测试 DNS、HTTP 和 HTTPS,他只在 https 页面上收到 404 错误。我可以随心所欲地从我的 phone 访问任何页面——与此同时他收到 404。然后我让他访问 https:\\www.google.com 并且每次都对他有效。然后他尝试了我们的服务器并...即时 404,服务器日志中没有任何内容。
我再说一遍 - 我从来没有任何问题。相同 phone,相同 iOS,相同二进制。
有没有人遇到过这样的事情?
编辑:更新了场景并更正了一些不太正确的信息。
我发现了我的问题,这有点令人尴尬,但如果这对其他人有帮助,那么就开始吧。 404 试图告诉我一些事情。
在我的国家,所有 ISP 仍然是 运行IPv4。我的朋友搬到了美国,那里的一切都是 IPv6。基本上,我没有意外地设置 Apache 以将 IPv6/SSL 配置指向与 IPv4/SSL 相同的 "HTML" 目录 - 因此 404s 是他的而不是我的。但是端口 80 上的 IPv6 配置正确。我无法测试 IPv6,因为它对我不可用。
我在服务器上使用 wget 后想通了。我可以在 index.html 页面上点击,但没有别的。我找到了一个额外的 "html" 目录,因此找到了指向它的 IPv6 配置。日志中没有任何内容,因为它们是错误的日志(翻白眼,感觉像个菜鸟)。
我曾尝试过 IPv6 代理页面,但事实证明它已损坏。即使在我修复了我的站点并且该应用程序可以在 IPv6 上运行后,代理站点仍然会出现 SSL 错误。它可能使用了我已经禁止的过时协议。相当红的鲱鱼。