Có ba máy chủ mà một ứng dụng Android thực hiện xác thực và ủy quyền. Máy chủ cuối cùng là REST API. Lần đầu tiên sử dụng quy trình xác thực và ủy quyền Oauth, nó hoạt động mà không có vấn đề gì.Android java.security.cert.CertPathValidatorException: Niềm tin neo cho đường dẫn chứng nhận không tìm thấy
Nhưng nếu người dùng giết ứng dụng sau khi đăng nhập và truy cập các dịch vụ được cung cấp bởi REST API và sau đó mở lại ứng dụng, vấn đề này phát sinh. Trong thời gian này quá trình xác thực và ủy quyền không xảy ra, chỉ có API REST. Nó gây ra java.security.cert.CertPathValidatorException
nhưng nó đã hoạt động trong lần sử dụng đầu tiên (đăng nhập và sau đó sử dụng ứng dụng).
Ai đó có thể giải thích tình huống đằng sau ngoại lệ này và có vấn đề gì với ứng dụng. Điều này hoạt động nếu ngoại lệ chứng nhận bị bỏ qua dưới đây theo this SO answer.
SSLSocketFactory sslSocketFactory = null;
try {
TrustManagerFactory tmf = TrustManagerFactory.getInstance(
TrustManagerFactory.getDefaultAlgorithm());
// Initialise the TMF as you normally would, for example:
try {
tmf.init((KeyStore)null);
} catch(KeyStoreException e) {
e.printStackTrace();
}
TrustManager[] trustManagers = tmf.getTrustManagers();
final X509TrustManager origTrustmanager = (X509TrustManager)trustManagers[0];
// Create a trust manager that does not validate certificate chains
TrustManager[] wrappedTrustManagers = new TrustManager[]{
new X509TrustManager() {
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return origTrustmanager.getAcceptedIssuers();
}
public void checkClientTrusted(X509Certificate[] certs, String authType) {
try {
origTrustmanager.checkClientTrusted(certs, authType);
} catch(CertificateException e) {
e.printStackTrace();
}
}
public void checkServerTrusted(X509Certificate[] certs, String authType) {
try {
origTrustmanager.checkServerTrusted(certs, authType);
} catch(CertificateException e) {
e.printStackTrace();
}
}
}
};
//TrustManager[] trustAllCerts = TrustManagerFactory.getInstance("SSL").getTrustManagers();
// Install the all-trusting trust manager
final SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, wrappedTrustManagers, new java.security.SecureRandom());
// Create an ssl socket factory with our all-trusting manager
sslSocketFactory = sslContext.getSocketFactory();
} catch (NoSuchAlgorithmException | KeyManagementException e) {
e.printStackTrace();
}
return sslSocketFactory;
Tôi đang sử dụng Okhttp 3 cho các yêu cầu http. Bất kỳ đề xuất nào cũng sẽ giúp giải quyết vấn đề. Và vui lòng cho tôi biết nếu tôi sử dụng đoạn mã trên, liệu đó có phải là vi phạm bảo mật không? nó sẽ ảnh hưởng đến tính bảo mật của ứng dụng?
Lưu ý: Việc triển khai 'checkServerTrusted' của bạn là vô ích khi bạn nắm bắt và bỏ qua CertificateException. Do đó tất cả các chứng chỉ máy chủ (đáng tin cậy và không tin cậy) đều được chấp nhận! – Robert
@Robert cảm ơn vì đã làm rõ. Có ** điều này là không an toàn và vô dụng trong quan điểm bảo mật **, tôi đã tìm thấy giải pháp đúng như được mô tả trong câu trả lời của tôi. –