2013-06-18 38 views
12

Tôi đang cố chèn bản ghi vào MySQL bằng cách đăng dữ liệu lên máy chủ PHP từ một ứng dụng Android. Tôi đã thêm sự cho phép INTERNET để AndroidManifest.xmljavax.net.ssl.sslpeerunverifiedexception không có chứng chỉ ngang hàng

tôi nhận được javax.net.ssl.SSLPeerUnverifiedException: No peer certificate

mã Android

private void senddata(ArrayList<NameValuePair> data) 
{ 
    try 
    { 
     HttpClient httpclient = new DefaultHttpClient(); 
     HttpPost httppost = new HttpPost("https://10.0.2.2/insert222.php"); 
     httppost.setEntity(new UrlEncodedFormEntity(data)); 
     HttpResponse response = httpclient.execute(httppost); 

    } 
    catch (Exception e) { 
     // TODO: handle exception 
     Log.e("log_tag", "Error: "+e.toString()); 
    } 
} 

bất cứ ai có thể giúp đỡ?

+0

bạn đã giải quyết được sự cố của mình hay vẫn đang chờ xử lý? – Dev

Trả lời

8

Cảnh báo: Không thực hiện điều này trong mã sản xuất bạn sẽ sử dụng trên mạng mà bạn không hoàn toàn tin tưởng. Đặc biệt là bất cứ điều gì đi qua internet công cộng. This link cung cấp câu trả lời đúng hơn. Here là triển khai sử dụng SSL.

Vấn đề của bạn là bạn đang sử dụng DefaultHttpClient cho https (url an toàn).
Tạo một DefaultHttpClient tùy chỉnh

public static HttpClient createHttpClient() 
{ 
    HttpParams params = new BasicHttpParams(); 
    HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1); 
    HttpProtocolParams.setContentCharset(params, HTTP.DEFAULT_CONTENT_CHARSET); 
    HttpProtocolParams.setUseExpectContinue(params, true); 

    SchemeRegistry schReg = new SchemeRegistry(); 
    schReg.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80)); 
    schReg.register(new Scheme("https", SSLSocketFactory.getSocketFactory(), 443)); 
    ClientConnectionManager conMgr = new ThreadSafeClientConnManager(params, schReg); 

    return new DefaultHttpClient(conMgr, params); 
} 

Thần thay đổi mã của bạn như sau:

 HttpClient httpclient = createHttpClient(); 
     HttpPost httppost = new HttpPost("https://10.0.2.2/insert222.php"); 
     httppost.setEntity(new UrlEncodedFormEntity(data)); 
     HttpResponse response = httpclient.execute(httppost); 

Có một cái nhìn tại here nếu bạn có vấn đề
Nó sẽ làm việc.

+11

Bạn không nên khuyên mọi người 'tin tưởng tất cả chứng chỉ' mà không thông báo cho họ về vi phạm an ninh có liên quan. – EJP

+0

@EJP bạn nói đúng! Liên kết tôi hướng dẫn anh ta để có CẢNH BÁO! Có lẽ đó là không đủ. –

+1

Cảnh báo sẽ có ở đây. – EJP

2

Tôi gặp sự cố này với máy chủ IIS 8. Trong liên kết https, tôi phải bỏ chọn hộp kiểm có nhãn "Yêu cầu chỉ định tên máy chủ". Khi tôi đã bỏ chọn nó, tôi bỏ lỗi.

+0

@skrrgwasme khi xem xét những điều này, hãy nhớ đọc toàn bộ câu. Trong khi nó bắt đầu nghe có vẻ như nó sẽ là một câu hỏi hoặc một 'tôi có vấn đề này quá' bình luận, điều này là không. – AdamMc331

+0

@ McAdam331 Bạn hoàn toàn đúng. Cảm ơn đã chỉ ra điều đó.Tôi cố gắng đọc toàn bộ bài đăng, nhưng rõ ràng là đã nhầm lẫn với bài đăng này. – skrrgwasme

+0

@skrrgwasme xảy ra với những người tốt nhất của chúng tôi, chỉ muốn chắc chắn rằng bạn đã biết. – AdamMc331

0

Tôi phải nói tất cả các chứng chỉ đáng tin cậy (được tin cậy bởi các trung tâm được ủy quyền như COMODO, Symantec, v.v.) phải hoạt động trong mọi trường hợp. Nếu ứng dụng của bạn nhận được javax.net.ssl.SSLPeerUnverifiedException: Không có chứng chỉ ngang hàng bằng chứng chỉ đã mua, bạn cung cấp sai điều gì đó ở phía máy chủ. Để kiểm tra việc sử dụng lệnh openssl s_client -connect example.com:443 để nhận thông tin bên trong về chứng chỉ mà ứng dụng của bạn nhận được. Trong trường hợp có thể máy chủ nginx của tôi đã gửi chứng chỉ sai trong một số trường hợp.

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