簡體   English   中英

Android:無法通過HTTPS訪問本地網站

[英]Android: Unable to access a local website over HTTPS

我正在嘗試訪問本地托管的網站,並獲取其HTML源進行解析。 我有幾個問題:

1)我可以使用“ https://這里的IP地址”作為有效的URL嘗試訪問。 我不想在/ etc / hosts文件中進行更改,所以我想用這種方式。

2)我無法獲取html,因為它給了我握手異常和證書問題。 我已經嘗試了很多可通過網絡獲得的幫助,但是並不成功。

這是我正在使用的代碼:

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" });
    }
}

使用https://local-ip-address訪問受SSL保護的網頁的問題在於,這很可能導致瀏覽器信任該網站的SSL證書。

這是因為瀏覽器將通過檢查HTTPS URL中使用的主機名是否與SSL證書中包含的CN=主機名匹配來嘗試驗證SSL證書。

更新以刪除對本地主機的引用(我最初認為本地托管的網站與瀏覽器位於同一服務器上,而Android顯然不是這種情況):

通過更改本地主機表以包括SSL證書中包含的標准主機名,並將該名稱與您要使用的特定IP地址相關聯,可以避免此驗證錯誤。

在/ etc / hosts中對IP地址進行硬編碼的替代方法

如果您可以控制SSL證書的創建方式,則可以使用“ Subject Alternate Names或“ SAN”向證書添加其他主機名,甚至IP地址。 如果您使用的是自簽名證書,這可能是一個可行的選擇。

但是,如果還可以從Internet訪問本地托管的網站,則很有可能使用購買的SSL證書,並且隨着時間的推移,內部IP地址可能會更改,因此將IP地址硬編碼到此類證書中很可能會導致支持問題隨着時間的流逝,需要重新購買SSL證書。

如果您可以控制移動服務器使用的內部IP地址,則另一種選擇是將其內部IP地址硬編碼到移動設備正在使用的DNS服務器中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM