HttpsURLConnection server_name损坏(?)超过3g

时间:2012-08-07 10:33:34

标签: android ssl 3g sni

根据Google的推荐,我在我的api-level 15项目中使用了HttpsURLConnection。

我的测试用例非常简单:

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的代理地址。

我已经抛弃了“客户你好”#39;两个请求的数据包和握手协议/扩展:server_name字段包含wifi请求的目标主机名(myserver.com),但包含3g请求的APN代理地址。

这是:

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

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

我可以使用DefaultHttpClient的一个简单子类成功地发出超过3g的请求,但由于我的最低API级别是15,我希望能够选择'首选'路径。

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

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

2 个答案:

答案 0 :(得分:4)

事实证明这是known issue

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

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

我希望这有助于某人。

答案 1 :(得分: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响应代码。