Có lẽ các mã dưới đây sẽ rất hữu ích cho bạn:
1.Create một lớp HttpsTrustManager
mà thực hiện X509TrustManager
:
public class HttpsTrustManager implements X509TrustManager {
private static TrustManager[] trustManagers;
private static final X509Certificate[] _AcceptedIssuers = new X509Certificate[]{};
@Override
public void checkClientTrusted(
java.security.cert.X509Certificate[] x509Certificates, String s)
throws java.security.cert.CertificateException {
}
@Override
public void checkServerTrusted(
java.security.cert.X509Certificate[] x509Certificates, String s)
throws java.security.cert.CertificateException {
}
public boolean isClientTrusted(X509Certificate[] chain) {
return true;
}
public boolean isServerTrusted(X509Certificate[] chain) {
return true;
}
@Override
public X509Certificate[] getAcceptedIssuers() {
return _AcceptedIssuers;
}
public static void allowAllSSL() {
HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() {
@Override
public boolean verify(String arg0, SSLSession arg1) {
return true;
}
});
SSLContext context = null;
if (trustManagers == null) {
trustManagers = new TrustManager[]{new HttpsTrustManager()};
}
try {
context = SSLContext.getInstance("TLS");
context.init(null, trustManagers, new SecureRandom());
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (KeyManagementException e) {
e.printStackTrace();
}
HttpsURLConnection.setDefaultSSLSocketFactory(context
.getSocketFactory());
}
}
2.Add HttpsTrustManager.allowAllSSL()
trước khi bạn thực hiện một yêu cầu https:
HttpsTrustManager.allowAllSSL();
String tag_string_req = "string_req";
StringRequest strReq = new StringRequest(Request.Method.POST,
your_https_url, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
Log.d(TAG, "response :"+response);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
VolleyLog.d(TAG, "Error: " + error.getMessage());
}
}){
@Override
protected Map<String, String> getParams() {
Map<String, String> params = new HashMap<String, String>();
params.put("username", "max");
params.put("password", "123456");
return params;
}
};
AppController.getInstance().addToRequestQueue(strReq, tag_string_req);
Tôi đoán là bạn sẽ cần định cấu hình theo cách tương tự nếu bạn sử dụng trực tiếp 'HttpUrlConnection'. Xem http://commonsware.com/blog/2013/03/04/ssl-android-basics.html và http://nelenkov.blogspot.ie/2011/12/using-custom-certificate-trust-store-on .html – CommonsWare
Tôi đã tìm thấy một lớp được gọi là 'HurlStack' mở rộng' HttpStack' là một tham số tùy chọn cho 'Volley.newRequestQueue'. Phương thức khởi tạo của 'HurlStack' chấp nhận một tham số kiểu' SSLSocketFactory' và nó được viết bằng javadoc của nó: "Nhà máy SSL để sử dụng cho các kết nối HTTPS" nhưng chưa thử nó. –