0

Google の推奨に従って、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 のプロキシ アドレスになります。

両方のリクエストの 'Client Hello' パケットをダンプしました。Handshake Protocol/Extension:server_name フィールドには、wifi リクエストのターゲット ホスト名 (myserver.com) が含まれていますが、3g リクエストの APN プロキシ アドレスが含まれています。

これは :

  • 間違ってコーディングしたもの
  • 携帯電話 (Samsung Galaxy S3) で誤って構成したもの
  • サーバーで誤って構成したもの
  • モバイルプロバイダーが行っている悪いこと
  • Android ライブラリのバグ

私のサーバーは、この vhost に専用の 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 に答える