2012-01-30 61 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