2011-03-28 29 views
7

Şu anda Android (2.2) için bir istemci parçası ve SSL kullanan bir sunucu yazıyorum. Sunucuyla normal bir istemci arasında mesaj alışverişi yaptım, ancak Android kendinden imzalı sertifikalar konusunda çok mutlu görünmüyor. Stackoverflow ve Googled A LOT aradım ve LOTS insanların benzer sorunlar yaşıyorsanız. Şimdiye kadar bulduğum tüm cevaplar ya çalışmıyordu ya da hiç anlamıyordu. Dışarıdaki kod örneklerinin çoğu HTTPS içindir, ancak bu bir soket üzerinden iletişim kurabildiğim için kullanamıyorum (SSLSocket benim en iyi tahminimdir). Çok fazla farklı kod denedim, ama şimdi tekrar sıfıra döndüm.SSL İstemci

Şimdiye kadar bir sertifika (bunun doğru olduğunu düşünüyorum) ve özel bir TrustManager oluşturmam gerektiğini anladım. Açıkçası, herhangi bir çalışma kodunu bulamadım, bu yüzden burada soruyorum, çünkü genellikle bazı yararlı insanlar var.

Yapılması gereken şeyin ayrıntılı bir açıklamasını ve çalışan bir Android istemci koduna dönüştürülebilen bazı kodları arıyorum. peşin

Teşekkür

cevap

1

Ben yerli android tarayıcı taşıma ile yaptım. Sadece ssl içeriğinin nasıl oluşturulduğunu değiştirdim. ben de

https://market.android.com/details?id=org.sandrob

http://code.google.com/p/sandrob/source/browse/misc/examples/HttpsConnection.java

+0

Cevabınız için teşekkür ederiz. Bağlandığınız koda baktım ve ilginç görünüyor. Sorun, özel yapılmış gibi görünen çok fazla sınıf kullanmasıdır. Bazılarını Google'da araştırdım ve diğer kütüphanelerde uygulandıklarını öğrendim. CertificateChainValidator android.net.http paketinde olması gerekiyormuş gibi görünüyor - ama o değil. Standart kütüphaneleri kullanarak basitleştirilmiş tam çalışma örneği var mı? – Casper

1

CertificateChainValidator android kaynaklardan parçasıdır :) ... SandroB sitedeki bazı çalışma örneği koymak ama söz verdi. En azından versiyon/etiketinde 2.2.1_r1

Eğer android kaynaklardan Tarayıcı kurmak ve SSLContext HttpsConnection.java dosyasında başlatılır ne kadar değiştirebilir çalışması yapmak.

Anahtar Yöneticilere (parola/parola ile başlatılmış) ve trustManager'lara (tüm güvenilenlere) ihtiyacınız vardır.

sslContext.engineInit (keyManagers, trustManagers, null, cache, null);

+1

Merhaba. Bunu ithal edemiyorum ve http://developer.android.com/reference/android/net/http/package-summary.html adresine göre işlev görünmüyor. Bildiğim kadarıyla sertifikaları işlemek için gümrük yöneticileri oluşturmam gerekecek, ancak henüz bir çalışma kodu bulamıyorum. Bu arada Android 2.2 (API 8) kullanıyorum. – Casper

1
public class MySSLSocketFactory extends SSLSocketFactory { 
    SSLContext sslContext = SSLContext.getInstance("TLS"); 

    public MySSLSocketFactory(KeyStore truststore) throws NoSuchAlgorithmException, KeyManagementException, KeyStoreException, UnrecoverableKeyException { 
     super(truststore); 

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

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

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

     sslContext.init(null, new TrustManager[] { tm }, null); 
    } 

    @Override 
    public Socket createSocket(Socket socket, String host, int port, boolean autoClose) throws IOException, UnknownHostException { 
     return sslContext.getSocketFactory().createSocket(socket, host, port, autoClose); 
    } 

    @Override 
    public Socket createSocket() throws IOException { 
     return sslContext.getSocketFactory().createSocket(); 
    } 
} 

Ve HttpClient

public HttpClient getNewHttpClient() { 
     try { 
      KeyStore trustStore = KeyStore.getInstance(KeyStore 
        .getDefaultType()); 
      trustStore.load(null, null); 

      SSLSocketFactory sf = new MySSLSocketFactory(trustStore); 
      sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); 

      HttpParams params = new BasicHttpParams(); 
      HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1); 
      HttpProtocolParams.setContentCharset(params, HTTP.UTF_8); 

      SchemeRegistry registry = new SchemeRegistry(); 
      registry.register(new Scheme("http", PlainSocketFactory 
        .getSocketFactory(), 80)); 
      registry.register(new Scheme("https", sf, 443)); 

      ClientConnectionManager ccm = new ThreadSafeClientConnManager(
        params, registry); 

      return new DefaultHttpClient(ccm, params); 
     } catch (Exception e) { 
      return new DefaultHttpClient(); 
     } 
    } 

olduğunu size yardımcı olur.