2012-08-07 35 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響應代碼。