2011-01-13 32 views
5

Tôi mới sử dụng Android và tôi đang đấu tranh để thực hiện cuộc gọi đến dịch vụ web SSL cho Ứng dụng Android. Mã của tôi là như sau:Tôi làm cách nào để gọi một dịch vụ web bảo mật (SSL) trong Android khi Android không thấy chứng chỉ?

Log.v("fs", "Making HTTP call..."); 
HttpClient http = new DefaultHttpClient(); 
HttpGet request = new HttpGet("https://example.com/api"); 

try { 

    String response = http.execute(request, new BasicResponseHandler()); 
    Log.v("fs", response); 

} catch (Exception e) { 

    Log.v("fs", e.toString()); 
} 

Các Output là:

Making HTTP call... 
javax.net.SSLPeerUnverifiedException: No peer certificate 

Mọi góp ý để làm cho công việc này sẽ là tuyệt vời.

Tôi nên lưu ý rằng đây là chứng chỉ hợp lệ. Nó được ký bởi một CA chính thức.

+0

Giấy chứng nhận SSL có hợp lệ hoặc bạn đang sử dụng một số máy chủ dev không? –

+0

Có lẽ http://stackoverflow.com/questions/3761737/https-get-ssl-with-android-and-self-signed-server-certificate này –

+0

Tôi có cùng một vấn đề với bạn, bạn đã tìm thấy giải pháp làm việc cho điều này ? –

Trả lời

0

Tôi cũng nghĩ đây là vấn đề với chứng chỉ của máy chủ. Vui lòng xem chương trình InstallCert.java tại đây: http://blogs.oracle.com/andreas/entry/no_more_unable_to_find. Đây có thể là một cách tốt để xác minh chứng chỉ của máy chủ. Nếu bạn không thể tải xuống bằng chương trình này, tôi sẽ nói, hãy xác minh lại máy chủ của bạn.
Đăng kết quả của bạn sau khi sử dụng chương trình này tại đây và chúng tôi sẽ lấy nó từ đó.

+1

Tôi đã biên dịch và chạy chương trình, đầu ra: Bắt đầu bắt tay SSL ... Không có lỗi, chứng chỉ đã được tin cậy – mmattax

+0

Bạn đã thử liên kết tôi đã gửi cho bạn để vô hiệu xác thực SSL chưa. Nếu điều đó hoạt động thì bạn biết vấn đề là gì. Tôi nhớ lại ssl cerad của Godaddy là kinda funky. –

+0

Liên kết đã chết, chúng ta có thể tìm thấy nó ở nơi khác không? –

-10

tôi cho rằng bạn không thể có trong dịch vụ web HTTPS. Chỉ có phương thức được phép là POST thử và xem.

+3

Bạn lấy từ đâu. Bạn có biết điều này hoặc bạn chỉ đoán. Trong thực tế, ngay cả đối với HTTPS, tất cả các phương thức HTTP chuẩn đều được cho phép. Nếu GET không được phép, bạn sẽ không thể nhận bất kỳ trang web nào trong trình duyệt của mình khi truy cập nó qua HTTPS. – sven

+4

Câu trả lời này là sai lầm đến nỗi tôi ước rằng tôi đã có một câu trả lời khác cho nó. –

+1

HTTPS và POST là hai thứ khác nhau trong các lớp khác nhau. – prageeth

1

Hãy thử cách sau. Tôi đã thêm SSLSocketFactory để xử lý các kết nối SSL, cộng thêm nó hỗ trợ thêm cho việc xử lý nhiều kết nối đồng thời bằng cách sử dụng ThreadSafeClientConnManager. Bạn có thể xóa hết thời gian chờ của ổ cắm và thời gian chờ kết nối.

SchemeRegistry schemeRegistry = new SchemeRegistry(); 
    schemeRegistry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80)); 
    schemeRegistry.register(new Scheme("mxiss", SSLSocketFactory.getSocketFactory(), 443)); 

    HttpParams params = new BasicHttpParams(); 
    int timeoutConnection = 5000; 
    HttpConnectionParams.setConnectionTimeout(params, timeoutConnection); 
    int timeoutSocket = 10000; 
    HttpConnectionParams.setSoTimeout(params, timeoutSocket); 
    params.setParameter(ConnManagerPNames.MAX_TOTAL_CONNECTIONS, 30); 
    params.setParameter(ConnManagerPNames.MAX_CONNECTIONS_PER_ROUTE, new ConnPerRouteBean(30)); 
    params.setParameter(HttpProtocolParams.USE_EXPECT_CONTINUE, false); 
    HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1); 

    ThreadSafeClientConnManager cm = new ThreadSafeClientConnManager(params, schemeRegistry); 

    _client = new DefaultHttpClient(cm, params); 

Hy vọng điều này sẽ hữu ích.

Nếu khách hàng của bạn không tin tưởng chứng chỉ máy chủ đăng ký giao thức khác và chấp nhận tất cả chứng chỉ cho giao thức đó. Trước tiên bạn nên đăng ký giao thức trước khi làm bất cứ điều gì.

Protocol mxiss = new Protocol("mxiss", new EasySSLProtocolSocketFactory(), 443); 
Protocol.registerProtocol("mxiss", mxiss); 

Sau đó, thay vì "https" bạn phải sử dụng "mxiss"

EasySSLProtocolSocketFactory đến từ org.apache.commons.httpclient.contrib.ssl. Đặt tệp jar http://repo1.maven.org/maven2/ca/juliusdavies/not-yet-commons-ssl/0.3.11/not-yet-commons-ssl-0.3.11.jar vào đường dẫn lớp của bạn.

+0

Tôi có cùng sự cố và giải pháp của bạn dường như không có bất kỳ tác động nào :-( – Carsten

+0

Tôi đã cập nhật câu trả lời. Vui lòng thử lại – prageeth

+1

Trong trường hợp của tôi, vấn đề là thiết bị Android của tôi không tin tưởng vào gốc Giấy chứng nhận của CA. Firefox trên Android dường như sử dụng chứng chỉ gốc của chính nó và Windows cũng tin tưởng nó, nhưng các ứng dụng sử dụng CA đáng tin cậy tiêu chuẩn cho thiết bị có vấn đề. – Carsten

2

Bạn đã kiểm tra rằng ngày di động và giờ là những người đúng ??, nếu bạn đang sử dụng SSL và có điện thoại di động của bạn vào năm 1990 nó sẽ trở lại

javax.net.SSLPeerUnverifiedException: Không có giấy chứng nhận đẳng

Trân trọng

1
SchemeRegistry schemeRegistry = new SchemeRegistry(); 
schemeRegistry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80)); 
schemeRegistry.register(new Scheme("mxiss", SSLSocketFactory.getSocketFactory(), 443)); 


HttpParams params = new BasicHttpParams(); 
int timeoutConnection = 5000; 
HttpConnectionParams.setConnectionTimeout(params, timeoutConnection); 
int timeoutSocket = 10000; 
HttpConnectionParams.setSoTimeout(params, timeoutSocket); 

params.setParameter(ConnManagerPNames.MAX_TOTAL_CONNECTIONS, 30); 

params.setParameter(ConnManagerPNames.MAX_CONNECTIONS_PER_ROUTE, new ConnPerRouteBean); 

params.setParameter(HttpProtocolParams.USE_EXPECT_CONTINUE, false); 

HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1); 


ThreadSafeClientConnManager cm = new ThreadSafeClientConnManager(params, schemeRegistry); 

_client = new DefaultHttpClient(cm, params); 
Các vấn đề liên quan