HttpsURLConnection服务器名称已损坏(?)超过3g



根据谷歌的建议,我正在为我的api级别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的代理地址。

我已经丢弃了两个请求的"客户端你好"数据包,握手协议/扩展:服务器名称字段包含wifi请求的目标主机名(myserver.com),但包含3g请求的APN代理地址。

这是吗

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

我的服务器正在为这个vhost使用一个专用的ip地址。

我可以使用DefaultHttpClient的一个简单子类通过3g成功地发出请求,但由于我的最低API级别是15,我希望沿着"首选"路径前进。

任何建议都会受到热烈欢迎。我花了太多时间试图让这个基本的东西发挥作用。

我的同事负责这个项目的iPhone开发,他摇头,因为他的代码"开箱即用"。

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

我找到了一个变通方法,尽管我不确定它有多强大。到目前为止,对我来说有效的是在连接时禁用代理:

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

我希望这能帮助到别人。

这是我为Apache提供的服务器端解决方案(去年在Apache2-Apache/2.2.14上工作)

在更改ssl_engine_kernel.c之后,通过删除strcmp(主机、服务器名)检查的"return HTTP_BAD_REQUEST;",重新编译Apache/mod_ssl.so:

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响应代码。

相关内容

  • 没有找到相关文章

最新更新