【发布时间】:2017-01-08 21:31:33
【问题描述】:
Android 应用程序由三个主机进行身份验证和授权。最终主机是 REST API。第一次使用 Oauth 身份验证和授权过程,它可以正常工作。
但如果用户在登录并访问 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 请求。任何建议都将有助于解决问题。如果我使用上面的代码 sn-p,请告诉我,这是否违反安全规定?会影响应用的安全吗?
【问题讨论】:
-
注意:当您捕获并忽略 CertificateException 时,您的
checkServerTrusted实现毫无用处。因此,所有服务器证书(受信任和不受信任)都被接受! -
@Robert 感谢您的澄清。是的从安全角度来看这是不安全且无用的,我已经找到了答案中描述的正确解决方案。
标签: java android security ssl okhttp3