通过 Chrome / Android 通过 HTTPS 下载文件 下载管理器挂起

File download via HTTPS via Chrome / Android Download Manager hanging

通过 HTTPS 从安全区域下载文件时,Android 下载管理器中的文件下载挂起。它显示它会下载文件然后什么也不做。

Android 4.1.2 果冻豆

默认浏览器(Chrome)

有趣的是,从其他站点进行 HTTPS 下载也可以。所以没有一般​​的 SSL 问题。 所有移动 phone 的公司都受到影响。这不是 phone 问题。 所有下载都会受到影响。这不是文件。 它在使用 Firefox 而不是 Chrome 时有效。它在 iOS.

上与 chrome 一起使用

这是数千名员工的标准智能phone。 所以安装 firefox 不是一个选项。更新不是一个选项。

我首先想到下载管理器会丢失会话。所以我在两者之间放置了一个调试代理。会话信息正确传递。请求看起来不错。

GET /static/documents/testfile.pdf HTTP/1.1
Host: acmeintranet.acme.com
Connection: keep-alive
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
User-Agent: Mozilla/5.0 (Linux; Android 4.1.2; HUAWEI G525-U00 Build/HuaweiG525-U00)     AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.93 Mobile Safari/537.36
Referer: https://acmeintranet.acme.com/en/mob/ittest-page.htm
Accept-Encoding: gzip, deflate, sdch
Accept-Language: en-GB,en-US;q=0.8,en;q=0.6
Cookie: EdgeAccessCookie=FooFooFooFoo...

甚至响应与我从浏览器获得的响应完全相同。在服务器和 android smart phone 之间使用调试代理,下载工作正常。对我来说,区别似乎只是 SSL 证书。当我在中间使用带有 SSL 解密的调试代理时,代理使用原始 ssl 证书。 android phone 将从调试代理获取证书。

可能是某些证书或证书类型有问题?

我们确实找到了解决方案。

问题是,IP 地址被用于多个域。 每个域都有自己的证书。

bowser 会使用 SNI 告诉服务器需要哪个证书。 如果没有收到该信息,服务器将发送默认证书。 在我们的例子中,这是错误的。因此证书与域不匹配,下载挂起。

事实上,较旧的 android 版本不支持 SNI。

Android SSL - SNI support