0

根据 Google 的建议,我将 HttpsURLConnection 用于我的 api-level 15 项目。

我的测试用例非常简单:

URL url = new URL(STATS);
HttpsURLConnection we = (HttpsURLConnection)url.openConnection();
InputStream in = new BufferedInputStream(we.getInputStream());

当我通过 WiFi 连接到我的服务器时,一切正常。

当我通过 3g 连接到我的服务器时,我的 Apache 日志中出现错误:

Hostname 202.139.83.152 provided via SNI and hostname myserver.com provided via HTTP are different

现在 202.139.83.152 地址是我的移动提供商 APN 的代理地址。

我已经转储了两个请求的“Client Hello”数据包,并且 Handshake Protocol/Extension:server_name 字段包含 wifi 请求的目标主机名 (myserver.com) 但 3g 请求的 APN 代理地址。

这是 :

  • 我编码错误的东西
  • 我在手机上配置错误的东西(三星 Galaxy S3)
  • 我在服务器上配置不正确的东西
  • 我的移动提供商正在做的一些邪恶的事情
  • Android 库中的一个错误

我的服务器为此虚拟主机使用专用 IP 地址。

我可以使用 DefaultHttpClient 的简单子类成功地发出超过 3g 的请求,但由于我的最低 API 级别为 15,我希望沿着“首选”路径走下去。

任何建议都会非常受欢迎。我花了太多时间试图让这个基本的东西正常工作。

我正在为这个项目处理 iPhone 开发的同事摇头,因为他的代码“开箱即用”。

4

2 回答 2

4

事实证明,这是一个已知问题

我找到了一种解决方法,尽管我不确定它有多强大。到目前为止对我有用的是在建立连接时禁用代理:

HttpsURLConnection http = (HttpsURLConnection) url.openConnection(Proxy.NO_PROXY);

我希望这可以帮助别人。

于 2012-08-09T10:30:54.640 回答
0

这是我针对 Apache 的服务器端解决方法(去年在 Apache2 - Apache/2.2.14 上工作)。

通过删除“return HTTP_BAD_REQUEST;”更改 ssl_engine_kernel.c 后重新编译 Apache/mod_ssl.so 对于 strcmp(host, servername) 检查:

if (strcmp(host, servername)) { 
        ap_log_error(APLOG_MARK, APLOG_ERR, 0, r->server, 
                "Hostname %s provided via SNI and hostname %s provided" 
                    " via HTTP are different", servername, host); 
        //return HTTP_BAD_REQUEST; // REMOVE THIS LINE

您仍然会收到错误日志消息,但不会收到错误 400 响应代码。

于 2013-04-24T12:18:49.050 回答