在我的某个应用中,我使用带有自签名证书的HTTPS,并按照Android开发人员培训网站(https://developer.android.com/training/articles/security-ssl.html#UnknownCa)中的示例代码进行操作。
我最近收到以下警告,说当前的实施不安全:
安全提醒
您的应用正在使用不安全的实施 X509TrustManager与Apache HTTP客户端的接口,产生了一个 安全漏洞。请参阅this Google Help Center article了解 详细信息,包括修复漏洞的截止日期。
有人可以提供更多详细信息,说明除了上面链接的示例代码之外应该更新的内容吗?
我应该实施自定义TrustManager
吗?如果是这样,它应该验证什么?
答案 0 :(得分:14)
尝试在您的代码中搜索“TrustManager”,如果没有找到,大多数情况都是因为包含第三方库。
对我来说,这是因为使用了旧版本的ACRA(https://github.com/ACRA/acra)。
答案 1 :(得分:3)
对我来说问题是Mobilecore。我已从应用中删除了该库并上传了新版本的apk,警告已从GPlay Dev控制台中消失。
答案 2 :(得分:3)
可能会迟到,但希望它可以帮助某人,在请求服务器之前调用此方法。如果证书不信任,你可以实现对话或用户可以决定的东西,这里我使用警告对话框。
public static void trustSSLCertificate(final Activity mActivity, final DownloadPortalTask task){
try {
HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() {
public boolean verify(String hostname, SSLSession session) {
return true;
}
});
SSLContext context = SSLContext.getInstance("TLS");
context.init(null, new X509TrustManager[]{new X509TrustManager() {
public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}
public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
try {
chain[0].checkValidity();
} catch (final Exception e) {
mActivity.runOnUiThread(new Runnable() {
@Override
public void run() {
AlertDialog.Builder builder = new AlertDialog.Builder(mActivity);
AlertDialog alertDialog = builder.create();
alertDialog.setCancelable(false);
String message = "There a problem with the security certificate for this web site.";
message += "\nDo you want to continue anyway?";
alertDialog.setTitle("SSL Certificate Error");
alertDialog.setMessage(message);
alertDialog.setButton(DialogInterface.BUTTON_POSITIVE, "OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
acceptSSL = true;
return;
}
});
alertDialog.setButton(DialogInterface.BUTTON_NEGATIVE, "Cancel", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
acceptSSL = true;
task.onInterruptedDownload();
}
});
alertDialog.show();
}
});
while( !acceptSSL){
try{
Thread.sleep(1000);
} catch( InterruptedException er) { }
}
}
}
public X509Certificate[] getAcceptedIssuers() {
return new X509Certificate[0];
}
}}, new SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(context.getSocketFactory());
} catch (Exception e) { // should never happen
e.printStackTrace();
}
}
答案 3 :(得分:1)
我还发现ARCA 4.3似乎可能是我的应用程序的罪魁祸首。
问题,是否有人知道验证问题是否已解决?目前,我有权访问的Play商店并未导致Google向我发出警告,但我们发布该应用的合作伙伴之一已收到警告。在向合作伙伴提供新的APK之前,我想验证问题已得到解决。