2012-07-08 127 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服務器中,如果您控制了該服務器。