2011-03-28 42 views
7

Tôi hiện đang viết một phần ứng dụng khách cho Android (2.2) và máy chủ sử dụng SSL. Tôi quản lý để trao đổi thông điệp giữa máy chủ và máy khách bình thường, nhưng Android dường như không quá hài lòng về chứng chỉ tự ký. Tôi đã tìm kiếm Stackoverflow và Googled A LOT và LOTS của những người có vấn đề tương tự. Tất cả các câu trả lời tôi đã tìm thấy cho đến nay hoặc là không hoạt động hoặc không có ý nghĩa gì cả. Hầu hết các mẫu mã ra có cho HTTPS, nhưng điều này tôi không thể sử dụng, như tôi cần phải giao tiếp thông qua một ổ cắm (SSLSocket là dự đoán tốt nhất của tôi). Tôi đã thử rất nhiều mã khác nhau, nhưng bây giờ tôi lại trở lại với số không.Ứng dụng khách SSL trên Android

Cho đến nay tôi đã tìm ra rằng tôi phải tạo chứng chỉ (nghĩ rằng tôi đã nhận được quyền đó) và TrustManager tùy chỉnh. Rõ ràng là tôi đã không thể tìm thấy bất kỳ mã làm việc nào, đó là lý do tại sao tôi hỏi ở đây, vì thường có một số người thực sự hữu ích.

Tôi đang tìm mô tả chi tiết về những gì được cho là đã hoàn thành và một số mã có thể được tạo thành mã khách hàng Android đang hoạt động.

Cảm ơn trước

Trả lời

1

Tôi đã thực hiện việc này bằng cách chuyển trình duyệt android gốc. Tôi vừa thay đổi cách tạo ngữ cảnh ssl. Tôi đã hứa rằng tôi cũng sẽ đưa một số ví dụ làm việc trên trang web SandroB nhưng ... :)

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

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

+0

Cảm ơn bạn đã trả lời. Tôi đã xem mã bạn đã liên kết và có vẻ thú vị. Vấn đề là nó sử dụng rất nhiều các lớp, mà dường như được tùy chỉnh thực hiện. Tôi đã tìm kiếm một số trong số đó trên Google và thấy rằng chúng đã được triển khai trong các thư viện khác. Cho phép lấy CertificateChainValidator dường như được cho là trong gói android.net.http - nhưng nó không có ở đó. Có một ví dụ làm việc đầy đủ đơn giản, sử dụng các thư viện chuẩn không? – Casper

1

CertificateChainValidator là một phần của nguồn Android. Ít nhất trong phiên bản/thẻ 2.2.1_r1

Để làm cho nó hoạt động, bạn có thể tạo trình duyệt từ nguồn Android và thay đổi cách SSLContext được khởi tạo trong tệp HttpsConnection.java.

Bạn cần keyManagers (được khởi tạo bằng cerfile/password) và trustManagers (tin tưởng tất cả).

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

+1

Xin chào. Tôi dường như không thể nhập nó và theo http://developer.android.com/reference/android/net/http/package-summary.html chức năng dường như không tồn tại. Theo như tôi biết tôi sẽ phải tạo người quản lý hải quan để xử lý chứng chỉ, nhưng tôi chưa tìm thấy một số mã làm việc. Tôi đang sử dụng Android 2.2 (API 8) bằng cách này. – 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(); 
    } 
} 

Và bạn HttpClient là

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(); 
     } 
    } 

Hy vọng nó sẽ giúp bạn.

Các vấn đề liên quan