2012-07-08 124 views
0

我试图访问本地托管的网站并获取其HTML源代码进行分析。我有几个问题:Android:无法通过HTTPS访问本地网站

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

回答

3

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

这是因为浏览器会尝试验证SSL证书,方法是检查HTTPS URL中使用的主机名是否与SSL证书内包含的CN=主机名匹配。

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

可以避免此验证错误通过更改本地主机表来包含SSL证书中包含的全限定主机名,并将该名称与要使用的特定IP地址相关联。

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

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

但是,如果您的本地托管网站也是通过Internet访问的,则很可能会使用购买的SSL证书,并且将IP地址硬编码到此类证书中很可能会随着时间的推移而导致支持问题,因为内部IP地址可能随时间而改变,需要重新购买SSL证书。

另一种选择可能是将您的内部IP地址硬编码到移动设备正在使用的DNS服务器中,如果您控制了该服务器。