2012-11-07 57 views
0

懷疑我試圖聯繫HTTPS服務器用下面的代碼:Android的HTTPS請求,在正確使用

HttpResponse response = new DefaultHttpClient().execute(new HttpGet("https://www.google.com")); 

和它完美的作品(它返回谷歌網頁和狀態碼200 OK)。

我也試着用下面的一個來聯繫同一服務器:

BasicHttpParams clientparams = new BasicHttpParams(); 
[... clientparams initializazion...] 

SchemeRegistry schemeRegistry = new SchemeRegistry(); 
schemeRegistry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80)); 

SSLSocketFactory sf = SSLSocketFactory.getSocketFactory(); 
sf.setHostnameVerifier(SSLSocketFactory.STRICT_HOSTNAME_VERIFIER); 
schemeRegistry.register(new Scheme("https", sf, 443)); 

ClientConnectionManager cm = new ThreadSafeClientConnManager(clientparams, schemeRegistry); 
HttpClient myClient = new DefaultHttpClient(cm, clientparams); 
HttpResponse response = myClient.execute(new HttpGet("https://www.google.com")); 

,這也完美的作品。我也嘗試過與其他服務器一起工作。

然後,當我需要使用SchemeRegistry來初始化一個http客戶端時,有人可以向我解釋嗎?而且,在哪些情況下,需要使用自定義KeyStore初始化SSLSocketFactory?

回答

0

我相信這取決於服務器在其SSL連接上使用的證書。如果它是由於作爲根CA而認可的東西(通常這些將是來自更常見來源的證書,例如Verisign),那麼它應該像您在這裏一樣工作。

另一方面,如果存在自定義證書或自簽名的東西,或者來自可能較小或未被普遍接受爲安全的來源,則必須創建自定義密鑰庫以手動處理與該證書。

谷歌可能會使用前者,這就是爲什麼你的代碼已經工作。

而且,我相信你可以添加

schemeRegistry.register(new Scheme("http", sf, 80)); 

到您的代碼,它會覆蓋HTTP連接,也沒有造成任何傷害你的應用程序。