2012-01-30 30 views
-1

我需要從https服務器通過我的Android應用程序檢索數據。 我得到的服務器證書,動態是這樣的:我需要在Android java中使用https的私人證書

KeyStore store = KeyStore.getInstance(KeyStore.getDefaultType()); 
store.load(null); 
URLConnection uc = new URL("https://duckduckgo.com/").openConnection(); 
uc.connect(); 
Certificate certs[] = ((HttpsURLConnection) uc).getServerCertificates(); 
for (int i = 0; i < certs.length; i++) store.setCertificateEntry("cert_"+ i, certs[i]); 
((HttpsURLConnection) uc).disconnect(); 

我有一個自定義的HttpClient:

public class MyHttpClient extends DefaultHttpClient { 
    final KeyStore store; 

    public MyHttpClient(KeyStore store) { 
     this.store = store; 
    } 

    @Override 
    protected ClientConnectionManager createClientConnectionManager() { 
     SchemeRegistry registry = new SchemeRegistry(); 
     registry.register(new Scheme("http", PlainSocketFactory 
       .getSocketFactory(), 80)); 
     registry.register(new Scheme("https", newSslSocketFactory(), 443)); 
     return new SingleClientConnManager(getParams(), registry); 
    } 

    private SSLSocketFactory newSslSocketFactory() { 
     try { 
      return new SSLSocketFactory(store); 
     } catch (Exception e) { 
      throw new AssertionError(e); 
     } 
    } 
} 

,並檢索數據形成這樣的服務器:

HttpEntity responseEntity; 
URI url = new URI("https://duckduckgo.com/?q=android+java"); 
HttpGet httpGet = new HttpGet(url); 
HttpClient client = new MyHttpClient(store); 
httpGet.addHeader("Content-Type", "text/xml"); 
HttpConnectionParams.setConnectionTimeout(client.getParams(), 15000); 
HttpResponse getResponse = client.execute(httpGet); 

是一切,我送並接收加密?

我在想也許我必須提供服務器與我的公鑰?

+0

有沒有這樣的事情作爲'私人證書'。獲取服務器證書並將其存儲到信任庫中將不起作用,除非它們已經信任,即存在於信任庫中,該信任庫是循環的。不清楚你在問什麼。 – EJP 2017-03-20 09:11:36

回答

0

我在想也許我必須提供服務器與我的公鑰?

你可能指的是Public Key Cryptography,如果是這樣的話,那麼,對方就需要有你的公鑰,以便應對(你)進行加密。

但回答你的問題:是的,你發送和接收的所有內容(在這種情況下)都是加密的。在duckduckgo.com的情況下,您正在與驗證其SSL證書的公共Web服務器進行通信,因此一切都應該沒問題。

另請參閱this回答關於證書頒發機構和SSL實際工作方式的簡要概述。

0

簡答:不,您不需要證書就可以安全地與服務器進行通信。

長答案:證書的重點是如此一個客戶端和服務器可以在私人加密密鑰上達成一致,而無需其他人知道該密鑰是什麼。服務器證書將由一些主要證書頒發機構(Verisign等)頒發。您可以檢查權限以確保他們實際上向相關域名頒發了證書。一旦您驗證了授權,您可以使用證書中的公共加密密鑰,只有證書的所有者才能解密您加密的任何內容。對於SSL,您使用證書上的公鑰來加密會用來與服務器進行安全通信的會話加密密鑰。

當做這個東西時不要忽略使用它之前驗證證書!

+0

我打算省略驗證,因爲我將自己完全控制服務器。通過動態獲取證書,我不需要在電話的密鑰庫中預先加載證書。唯一的一點(如我所見)與證書是爲了確保加密 – 2012-01-31 08:07:32

+0

客戶端不會生成會話密鑰;不加密它;並不發送它。它通過密鑰協議協議進行協商。 – EJP 2017-03-20 00:01:01

相關問題