有三个主机用于android应用程序的身份验证和授权。最终主机是REST API。第一次使用Oauth身份验证和授权过程时,它可以正常工作。
但是,如果用户在登录并访问REST API提供的服务后关闭应用程序,然后再次打开应用程序,就会出现此问题。在这种情况下,身份验证和授权过程不会发生,只有REST API。这导致了java.security.cert.CertPathValidatorException异常,但在第一次使用(登录然后使用应用程序)期间它是有效的。
有人能解释一下这个异常背后的情景以及应用程序出了什么问题吗?根据this SO answer,如果忽略证书异常,则可以解决此问题。
但是,如果用户在登录并访问REST API提供的服务后关闭应用程序,然后再次打开应用程序,就会出现此问题。在这种情况下,身份验证和授权过程不会发生,只有REST API。这导致了java.security.cert.CertPathValidatorException异常,但在第一次使用(登录然后使用应用程序)期间它是有效的。
有人能解释一下这个异常背后的情景以及应用程序出了什么问题吗?根据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;
我正在使用Okhttp 3进行http请求。任何建议都可以帮助解决问题。如果我使用上面的代码片段,是否会存在安全问题?会影响应用程序的安全性吗?
checkServerTrusted
实现是无用的,因为你捕获并忽略了 CertificateException。因此所有服务器证书(受信任和不受信任的)都会被接受! - Robert