2011-04-18 61 views
8

我從我的android客戶端通過https調用web服務。我必須驗證從服務器端接收到的證書。我怎麼做 ?目前這是我用來調用Web服務的代碼。從服務器HTTPS接收並驗證證書 - android

private static String SendPost(String url, ArrayList<NameValuePair> pairs) { // url = "https://....." 
    errorMessage = ""; 
    String response = ""; 

    DefaultHttpClient hc=new DefaultHttpClient();  
    ResponseHandler <String> res=new BasicResponseHandler();  
    HttpPost postMethod=new HttpPost(url); 

    try { 
postMethod.setEntity(new UrlEncodedFormEntity(pairs)); 
     response = hc.execute(postMethod, res); 
    } catch (UnsupportedEncodingException e) { 
     e.printStackTrace(); 
    } catch (ClientProtocolException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    }   

    return response; 
} 

如何驗證在執行Post期間從服務器收到的自簽名證書?我必須通過公鑰/私鑰進行測試。客戶端將擁有一個CA文件。只需要客戶端使用CA來驗證服務器證書,服務就是公開的。這與公鑰/私鑰有關。在打電話之前,我怎樣才能從服務器接收證書?

他們有幾個選項和代碼片段可用在stackoverflow上。我發現有多個答案的鏈接夫婦是: Accepting a certificate for HTTPs on Android HTTPS GET (SSL) with Android and self-signed server certificate

但我不能做出來,這是很好/適用於我!我不想禁用所有或接受任何。必須檢查公/私鑰/

任何幫助,高度讚賞。

回答

4

Bob Lee寫了一篇關於如何在Android上使用SSL證書的博文。我認爲這是適用於您的情況:http://blog.crazybob.org/2010/02/android-trusting-ssl-certificates.html

你只需要創建一個KeyStore包含您的自簽名證書,並使用在該職位描述的定製HttpClient實施。


UPDATE:

主機名的驗證可以通過setting a custom X509HostnameVerifierSSLSocketFactory customizez。一些實現已經可以在安卓AllowAllHostnameVerifierBrowserCompatHostnameVerifierStrictHostnameVerifier

/* ... */ 
public class MyHostnameVerifier extends AbstractVerifier { 
    boolean verify(String hostname, SSLSession session) { 
    X509Certificate[] chain = session.getPeerCertificateChain(); 
    /* made some checks... */ 
    return checked; 
    } 
} 
sslSocketFactory.setHostnameVerifier(new MyHostnameVerifier()); 
+1

我如何收到證書從服務器和測試數據的呢? – Tvd 2011-04-18 11:02:00

+0

你不需要做任何事情。證書由服務器在SSL握手期間發送,並由客戶端應用程序根據KeyStore內容自動進行驗證。握手在任何HTTP數據交換之前執行。如果你想執行更復雜的或自定義的證書驗證,這也是可能的(但有一點需要解釋,在這個評論中) – Jcs 2011-04-18 11:14:59

+0

@ Jcs,我已經有了我必須使用的certificate.cer文件。我不明白與Bouncy Castle的部分。另外我沒有任何密碼傳遞給trusted.load(); ????我堅持在這些點上。 – Tvd 2011-04-18 13:29:18