2010-05-24 27 views
38

Đối với ứng dụng của tôi, Transdroid, tôi đang kết nối với máy chủ từ xa qua HTTP và tùy chọn an toàn qua HTTPS. Đối với các kết nối HTTPS này với HttpClient, tôi đang sử dụng cài đặt nhà máy SSL socket tùy chỉnh để đảm bảo các chứng chỉ tự ký đang hoạt động. Về cơ bản, tôi chấp nhận mọi thứ và bỏ qua mọi kiểm tra của bất kỳ chứng chỉ nào.Xử lý SSL tùy chỉnh đã ngừng hoạt động trên Android 2.2 FroYo

Tính năng này hiện đang hoạt động bình thường nhưng không còn hoạt động cho Android 2.2 FroYo nữa. Khi cố gắng để kết nối, nó sẽ trở lại là một ngoại lệ:

java.io.IOException: SSL handshake failure: I/O error during system call, Broken pipe 

Dưới đây là cách tôi khởi tạo HttpClient:

SchemeRegistry registry = new SchemeRegistry(); 
    registry.register(new Scheme("http", new PlainSocketFactory(), 80)); 
    registry.register(new Scheme("https", (trustAll ? new FakeSocketFactory() : SSLSocketFactory.getSocketFactory()), 443)); 
    client = new DefaultHttpClient(new ThreadSafeClientConnManager(httpParams, registry), httpParams); 

tôi sử dụng một FakeSocketFactory và FakeTrustManager, trong đó nguồn có thể được tìm thấy here .

Một lần nữa, tôi không hiểu tại sao nó đột nhiên ngừng hoạt động, hoặc thậm chí lỗi 'Broken pipe' có nghĩa là gì. Tôi đã thấy các tin nhắn trên Twitter mà Seesmic và Twidroid không hoạt động với SSL được bật trên FroYo, nhưng tôi không chắc liệu nó có liên quan hay không.

Cảm ơn mọi chỉ dẫn/trợ giúp!

Trả lời

40

Dưới đây là câu trả lời, với nhiều, rất nhiều nhờ vào một nhà phát triển Seesmic hữu ích sẵn sàng chia sẻ việc sửa chữa:

Trong nhà máy ổ cắm tùy chỉnh, tạo ổ cắm (với createSocket) đã rõ ràng được thay đổi đặc biệt cho SSLSocketFactory thực hiện. Vì vậy, người già:

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

nhu cầu phải được thay đổi để:

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

Và sau đó nó làm việc một lần nữa cho tôi!

CẬP NHẬT: Vì đây vẫn là câu trả lời phổ biến, hãy để tôi cập nhật liên kết của mình lên mã làm việc. This SSl-enabled socket factory hỗ trợ các giao thức hiện đại (TLS 1.1+), SNI và tùy chọn cho phép accept all certificates (không an toàn, bỏ qua tất cả chứng chỉ SSL) hoặc self-signed certificates (bằng hàm băm SHA-1). Thông tin

+0

Tôi đã có cùng một vấn đề. Cảm ơn bạn rất nhiều vì giải pháp nhanh chóng và dễ dàng này. –

+0

Bản sửa lỗi này không tự giải quyết vấn đề - tôi thấy rằng tôi cũng phải tăng mức độ ưu tiên của chuỗi trong đó kết nối socket được thiết lập thành THREAD_PRIORITY_URGENT_AUDIO (tiếp theo là thiết lập ưu tiên trở lại THREAD_PRIORITY_MORE_FAVORABLE sau khi kết nối đã được thành lập). Trong trường hợp cụ thể này, tôi nghi ngờ một hoạt ảnh đang sử dụng quá nhiều CPU :-( – tonys

+0

làm thế nào để bạn thực hiện nó? – Mikey

1

Thông tin thêm về vấn đề này http://code.google.com/p/android/issues/detail?id=10472 này khắc phục sự cố SSL chúng tôi đã có cho HTC Desire khi chúng tôi cập nhật Android 2.2

+0

Cụ thể, hãy xem nhận xét # 17: http://code.google.com/p/android/issues/detail?id=10807#c17. Điều này đã giúp tôi rất nhiều khi nhận được ứng dụng android sẳn sàng. – Andrew

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