2012-08-07 31 views
0

根据Google的建议,我为我的api-level 15项目使用HttpsURLConnection。HttpsURLConnection server_name已损坏(?)超过3g

我的测试用例是很简单的:

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

我已经抛弃了两个请求的'客户端Hello'数据包,并且握手协议/扩展名:server_name字段包含wifi请求的目标主机名(myserver.com),但包含3g请求的APN代理地址。

是这样的:

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

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

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

任何建议将非常好的收到。我花了太多时间试图让这个基本的东西工作。

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

+0

您应该检查代理是否真的需要使用APN。查看您手机的APN配置。 – Robert 2012-08-07 10:55:33

+0

谢谢罗伯特。哇。当我第一次插入SIM时,我使用了默认的APN(我假设)。 3g以上的所有其他互联网接入工作正常。我发现了一个没有代理设置的替代APN,我的代码现在可以工作了!但是,这对我的应用程序的潜在用户来说意味着什么?如果一个运营商_requires_(?)一个代理,那么呢?有什么方法可以绕过我的代码或补偿代理中的代理? – Horrendo 2012-08-07 11:14:05

+0

在欧洲,使用预配置代理的提供商很少。即使他们使用代理,代理通常也应该使用不改变任何内容的HTTPS传递。因此,我认为这种情况应该只发生很少。 – Robert 2012-08-07 11:25:47

回答

4

事实证明,这是一个known issue

我发现了一种解决方法,虽然我不确定它有多强大。什么工作对我来说,到目前为止是建立连接时禁用代理:

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

我希望这可以帮助别人。

+0

我有同样的问题。你是否认为这是一个稳定的解决方法? – likebobby 2012-08-16 11:38:11

+0

@BobbyJ,我只能用我目前的移动提供商进行测试,但至少它能正常工作。这并不理想,但我不能等待Google解决问题,并且修补程序将“普遍”可用。 – Horrendo 2012-08-19 03:07:38

+0

谢谢。我一直在瑞典的一些移动提供商和不同设置的WiFi网络中使用它。我对连接没有任何问题。 – likebobby 2012-09-04 07:03:30

0

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

通过删除“return HTTP_BAD_REQUEST;”更改ssl_engine_kernel.c后重新编译了Apache/mod_ssl.so为STRCMP(主机,服务器名)检查:

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