Có hàng tá bài đăng về vấn đề này (javax.net.ssl.SSLPeerUnverifiedException: Không có chứng chỉ ngang hàng) nhưng tôi chưa tìm thấy bất kỳ thứ gì phù hợp với mình.Sửa lỗi an toàn: javax.net.ssl.SSLPeerUnverifiedException: Không có chứng chỉ ngang hàng
Nhiều bài đăng (như this và this) "giải quyết" điều này bằng cách cho phép tất cả chứng chỉ được chấp nhận nhưng, tất nhiên, đây không phải là giải pháp tốt cho bất cứ điều gì ngoài thử nghiệm.
Những người khác có vẻ khá bản địa hóa và không hoạt động đối với tôi. Tôi thực sự hy vọng rằng ai đó có một số hiểu biết sâu sắc mà tôi thiếu.
Vì vậy, vấn đề của tôi: Tôi đang thử nghiệm trên một máy chủ chỉ có thể truy cập thông qua mạng cục bộ, kết nối qua HTTPS. Thực hiện cuộc gọi mà tôi cần thông qua trình duyệt hoạt động tốt. Không phàn nàn về chứng chỉ và nếu bạn kiểm tra các chứng chỉ, tất cả sẽ tốt.
Khi tôi thử trên thiết bị Android của tôi, tôi nhận được javax.net.ssl.SSLPeerUnverifiedException: No peer certificate
Dưới đây là đoạn code mà gọi đó là:
StringBuilder builder = new StringBuilder();
builder.append(/* stuff goes here*/);
httpGet.setEntity(new UrlEncodedFormEntity(nameValuePairs));
ResponseHandler<String> responseHandler = new BasicResponseHandler();
// Execute HTTP Post Request. Response body returned as a string
HttpClient httpClient = MyActivity.getHttpClient();
HttpGet httpGet = new HttpGet(builder.toString());
String jsonResponse = httpClient.execute(httpGet, responseHandler); //Line causing the Exception
Mã của tôi cho MyActivity.getHttpClient()
:
protected synchronized static HttpClient getHttpClient(){
if (httpClient != null)
return httpClient;
HttpParams httpParameters = new BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(httpParameters, TIMEOUT_CONNECTION);
HttpConnectionParams.setSoTimeout(httpParameters, TIMEOUT_SOCKET);
HttpProtocolParams.setVersion(httpParameters, HttpVersion.HTTP_1_1);
//Thread safe in case various AsyncTasks try to access it concurrently
SchemeRegistry schemeRegistry = new SchemeRegistry();
schemeRegistry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
schemeRegistry.register(new Scheme("https", SSLSocketFactory.getSocketFactory(), 443));
ClientConnectionManager cm = new ThreadSafeClientConnManager(httpParameters, schemeRegistry);
httpClient = new DefaultHttpClient(cm, httpParameters);
CookieStore cookieStore = httpClient.getCookieStore();
HttpContext localContext = new BasicHttpContext();
localContext.setAttribute(ClientContext.COOKIE_STORE, cookieStore);
return httpClient;
}
Bất kỳ trợ giúp sẽ được nhiều đánh giá cao.
Sửa
Cũng chỉ đề cập đến Tôi đã có vấn đề SSL khác với ứng dụng khác nhưng thêm phần SchemeRegistry
cố định nó cho tôi trước.
Chỉnh sửa 2
Cho đến nay tôi đã chỉ được thử nghiệm trên Android 3.1, nhưng tôi cần điều này để làm việc trên Android 2.2+ không phân biệt. Tôi vừa thử nghiệm trên trình duyệt trên tab Android của mình (Android 3.1) và nó phàn nàn về chứng chỉ. Đó là tốt trên trình duyệt máy tính của tôi, nhưng không phải trên trình duyệt Android hoặc trong ứng dụng của tôi.
Sửa 3
Hóa ra trình duyệt iOS cũng phàn nàn về nó. Tôi bắt đầu nghĩ rằng đó là một vấn đề chuỗi chứng chỉ mô tả ở đây (SSL certificate is not trusted - on mobile only)
vấn đề này do https m i right ?? –
Có, tôi đang kết nối qua https. Tôi sẽ cập nhật câu hỏi –
Hãy thử điều này: https://stackoverflow.com/a/38598593/2301721 – ashishdhiman2007