2013-09-19 3 views
2

Я борюсь за эту проблему в течение недели ... Я установил клиентский сертификат на устройстве Android. И мое приложение должно загружать файлы на сервер, требуя, чтобы клиентский сертификат выполнял рукопожатие.Клиентский сертификат Android Https

Есть подсказки, чтобы использовать это соединение? Благодаря ...

+0

Вы должны иметь сертификат эмитента (тот, кто подписал сертификат клиента) в качестве доверенного сертификата (или корневого сертификата) в вашей клиент. Также ваш сервер должен быть настроен, чтобы заставить клиентов отправлять свой сертификат (двухсторонний SSL). У вас есть эта конфигурация на вашем сервере и сертификаты, импортированные на клиенте? – zaerymoghaddam

+0

Как вы создаете свой httpclient, можете ли вы опубликовать код? –

+0

Спасибо всем, у меня была конфигурация на моем сервере и импортирована на клиент. Он работает в браузерах для Android. Но не знаете, как подключиться в приложении. Мой httpclient: :: Клиент HttpClient = новый DefaultHttpClient(); HttpPost post = new HttpPost (url); – Icarus

ответ

6

Попробуйте следующий ..

Вы должны иметь псевдоним сертификата клиента, который хранится в хранилище вашего андроид устройства. Это можно получить с помощью

private void chooseCert() { 
     KeyChain.choosePrivateKeyAlias(this, this, // Callback 
       new String[] {"RSA", "DSA"}, // Any key types. 
       null, // Any issuers. 
       null, // Any host 
       -1, // Any port 
       DEFAULT_ALIAS); 
    } 

После этого вы получите обратный вызов. Ваш класс должен реализовать KeyChainAliasCallback

И после этого попробовать ..

private void connect(){ 
      String alias = getAliasForClientCertificate(); 

      final X509Certificate[] certificates =getCertificateChain(alias); 
      final PrivateKey pk = getPrivateKey(alias); 



      KeyStore trustStore = KeyStore.getInstance(KeyStore 
        .getDefaultType()); 


      X509ExtendedKeyManager keyManager = new X509ExtendedKeyManager() { 

       @Override 
       public String chooseClientAlias(String[] strings, Principal[] principals, Socket socket) { 
        return alias; 
       } 

       @Override 
       public String chooseServerAlias(String s, Principal[] principals, Socket socket) { 
        return alias; 
       } 

       @Override 
       public X509Certificate[] getCertificateChain(String s) { 
        return certificates; 
       } 

       @Override 
       public String[] getClientAliases(String s, Principal[] principals) { 
        return new String[]{alias}; 
       } 

       @Override 
       public String[] getServerAliases(String s, Principal[] principals) { 
        return new String[]{alias}; 
       } 

       @Override 
       public PrivateKey getPrivateKey(String s) { 
        return pk; 
       } 
      }; 

      TrustManagerFactory trustFactory = TrustManagerFactory 
        .getInstance(TrustManagerFactory.getDefaultAlgorithm()); 

      trustFactory.init(trustStore); 

      TrustManager[] trustManagers = trustFactory.getTrustManagers(); 



      X509TrustManager[] tm = new X509TrustManager[] { new X509TrustManager() { 
       public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { 
       } 

       public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { 
       } 

       //   public X509Certificate[] getAcceptedIssuers() { 
       //    return certificates; 
       //   } 

       public X509Certificate[] getAcceptedIssuers() { 
        return certificates; 
       } 

       public boolean isClientTrusted(X509Certificate[] arg0) { 
        return true; 
       } 
      public boolean isServerTrusted(X509Certificate[] arg0) { 
       return true; 
      } 


     } }; 
     SSLContext sslContext = SSLContext.getInstance("TLS"); 
     sslContext.init(new KeyManager[] {keyManager}, tm, null); 
     SSLContext.setDefault(sslContext); 

     URL url = new URL("url.."); 
     HttpsURLConnection urlConnection = (HttpsURLConnection) url 
       .openConnection(); 
     urlConnection.setSSLSocketFactory(sslContext.getSocketFactory()); 

     HostnameVerifier hv = new HostnameVerifier() { 

      @Override 
      public boolean verify(String hostname, SSLSession session) { 
       return true; 
      } 
     }; 
     urlConnection.setHostnameVerifier(hv); 


     urlConnection.setInstanceFollowRedirects(false); 
     urlConnection.connect(); 
     int responseCode = urlConnection.getResponseCode(); 

} 

private X509Certificate[] getCertificateChain(String alias) { 
     try { 
      return KeyChain.getCertificateChain(this, alias); 
     } catch (KeyChainException e) { 
      e.printStackTrace(); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
     return null; 
} 
Смежные вопросы