0

ローカルでホストされているWebサイトにアクセスし、そのHTMLソースを解析しようとしています。いくつか質問があります:

1)「https:// An IP ADDRESS HERE」を有効なURLとして使用して、アクセスを試みることはできますか?/ etc / hostsファイルに変更を加えたくないので、この方法で変更します。

2)ハンドシェイクの例外と証明書の問題が発生するため、HTMLを取得できません。Webで利用できる多くのヘルプを試しましたが、成功しませんでした。

これが私が使用しているコードです:

public class MainActivity extends Activity {
    private TextView textView;
    String response = "";
    String finalresponse="";


    /** Called when the activity is first created. */

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textView = (TextView) findViewById(R.id.TextView01);
        System.setProperty("javax.net.ssl.trustStore","C:\\User\\*" );
        System.setProperty("javax.net.ssl.trustStorePassword", "" );
    }

    private class DownloadWebPageTask extends AsyncTask<String, Void, String> {

        @Override
        protected String doInBackground(String... urls) {



            TrustManager[] trustAllCerts = new TrustManager[] {
                new X509TrustManager() {
                    public java.security.cert.X509Certificate[] getAcceptedIssuers() {
                        return null;
                    }
                    public void checkClientTrusted(java.security.cert.X509Certificate[] certs, String authType) {
                    }
                    public void checkServerTrusted(java.security.cert.X509Certificate[] certs, String authType) {
                    }
                }
            };

            try {
                SSLContext sc = SSLContext.getInstance("SSL");
                sc.init(null, trustAllCerts, new java.security.SecureRandom());
                HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
            } catch (Exception e) {
            }


            try {
                URL url = new URL("https://172.27.224.133");

                HttpsURLConnection con =(HttpsURLConnection)url.openConnection();

                con.setHostnameVerifier(new AllowAllHostnameVerifier());
                finalresponse=readStream(con.getInputStream());
            } catch (Exception e) {
                e.printStackTrace();
            }
            return finalresponse;
        }

        private String readStream(InputStream in) {
            BufferedReader reader = null;
            try {
                reader = new BufferedReader(new InputStreamReader(in));
                String line = "";
                while ((line = reader.readLine()) != null) {
                    response+=line;
                }
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                if (reader != null) {
                    try {
                        reader.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
            return response;
        } 


        @Override
        protected void onPostExecute(String result) {
            textView.setText(finalresponse);
        }
    }

    public void readWebpage(View view) {
        DownloadWebPageTask task = new DownloadWebPageTask();
        task.execute(new String[] { "https://172.27.224.133" });
    }
}
4

1 に答える 1

4

SSLで保護されたWebページにアクセスするためにを使用https://local-ip-addressする場合の問題は、WebサイトのSSL証明書を信頼するブラウザで問題が発生する可能性が高いことです。

これは、ブラウザがHTTPS URLで使用されているホストCN=名がSSL証明書内に含まれているホスト名と一致することを確認することにより、SSL証明書を検証しようとするためです。

localhostへの参照を削除するように更新されました(ローカルでホストされているWebサイトは、ブラウザーと同じサーバー上にあると当初は考えていましたが、Androidでは明らかにそうではありません):

ローカルホストテーブルを変更してSSL証明書に含まれる完全修飾ホスト名を含め、その名前を使用する特定のIPアドレスに関連付けることで、この検証エラーを回避できます。

/ etc/hostsにIPアドレスをハードコーディングする代わりの方法

Subject Alternate NamesSSL証明書の作成方法を制御できる場合は、またはSANを使用して、追加のホスト名やIPアドレスを証明書に追加できます。自己署名証明書を使用している場合、これは実行可能なオプションである可能性があります。

ただし、ローカルでホストされているWebサイトがインターネットからもアクセスされている場合は、購入したSSL証明書を使用している可能性が高く、そのような証明書にIPアドレスをハードコーディングすると、内部IPアドレスが変更される可能性があるため、時間の経過とともにサポートの問題が発生する可能性があります。時間の経過とともにSSL証明書の再購入が必要になります。

別のオプションは、モバイルデバイスがサーバーを制御している場合にそのサーバーを使用しているDNSサーバーに内部IPアドレスをハードコーディングすることです。

于 2012-07-08T20:58:56.467 に答える