安卓:无法通过HTTPS访问本地网站(Android: Unable to access a loc

2019-07-30 07:40发布

我试图访问一个本地托管网站,并获得其HTML源代码进行解析。 我有几个问题:

1)我可以使用“https://开头的IP地址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" });
    }
}

Answer 1:

使用问题https://local-ip-address来访问SSL保护的网页是,这很可能会导致一个问题,与浏览器信任网站的SSL证书。

这是因为浏览器将试图通过检查主机名的HTTPS URL使用的匹配验证SSL证书CN=包含在SSL证书中的主机名。

更新,删除引用到本地主机(我原本以为本地托管的网站意味着相同的服务器浏览器,这与Android显然不是这样的):

您可以通过更改您的本地主机表,包括包含在SSL证书中的完全合格的主机名和名称与您要使用的特定IP地址关联避免此验证错误。

替代硬编码的IP地址在/ etc / hosts中

如果你有过的SSL证书是如何创建的,你可以添加额外的主机名和使用甚至IP地址到您的证书控制Subject Alternate Names或SAN。 如果您使用的是自签名证书,这可能是一个可行的选择。

但是,如果你的本地托管的网站也从互联网上访问你是不是有可能使用购买的SSL证书和硬编码IP地址转换为这样的证书将极有可能导致支持问题,随着时间的推移内部IP地址可以改变更多随着时间的推移,需要再购买一个SSL证书。

另一种选择可能是硬编码您的内部IP地址,如果你有超过该服务器控制的移动设备使用的DNS服务器。



文章来源: Android: Unable to access a local website over HTTPS
标签: android html ssl