如何在卸载应用程序时删除已安装的受信任CA证书

22
我有一个应用程序,提供安装CA证书的选项,并将其存储在用户选项卡中的“受信任凭据”中,它可以正常工作。
FYI(这是我安装证书的方法):
Intent installIntent = KeyChain.createInstallIntent();
javax.security.cert.X509Certificate x509 = javax.security.cert.X509Certificate.getInstance(caRootCertBytes);
installIntent.putExtra(KeyChain.EXTRA_CERTIFICATE, x509.getEncoded());
installIntent.putExtra(KeyChain.EXTRA_NAME,caRootCertName);
startActivity(installIntent);

如果应用程序被卸载,证书仍然保留在“受信任的凭据”中。
我希望应用程序卸载时证书也能被卸载。
我考虑使用KeyStoredeleteEntry方法来删除证书。 顺便提一下 (尽管我还没有测试。但希望它可以正常工作... 我会在测试后进行更新)
javax.security.cert.X509Certificate x509 = javax.security.cert.X509Certificate.getInstance(caRootCertBytes);

KeyStore ks = KeyStore.getInstance("AndroidCAStore")
if (ks != null) 
                        {
                            ks.load(null, null);
                            Enumeration<String> aliases = ks.aliases();
                            while (aliases.hasMoreElements()) 
                            {
                                String alias = (String) aliases.nextElement();
                                java.security.cert.X509Certificate cert = (java.security.cert.X509Certificate) ks.getCertificate(alias);
                                String name = x509.getIssuerDN().getName();                             
                                if (cert.getIssuerDN().getName().contains(name)) 
                                {
                                  ks. deleteEntry(alias)

                                }
                            }
                        }  

即使您认为上述代码有效,据我所知,我无法为自己的应用程序注册卸载的广播接收器。
如何在卸载我的应用程序时删除由我的应用程序安装的证书?
感谢任何帮助!

3
由于卸载进程不受您的代码控制,因此无法准确执行此操作,这是 Android 的设计。您只能希望用户不要忘记明确执行卸载。 - Display Name
@SargeBorsch - 你确定吗?但是keystore提供了一个公共API http://goo.gl/bDbiaI - Durai Amuthan.H
据我所知,没有办法监听应用程序的卸载事件。但是,您可以通过使用推送服务发送定期的“你在那里吗?”消息来跟踪分析数据(无回答=已卸载逻辑。是的,很糟糕)。但是,这仍然无法解决您的证书删除问题。我也想知道是否有解决方案。 - Ercan
@Ercan - 当然,如果我找到任何解决方案,我会让您知道。 - Durai Amuthan.H
3个回答

1
你无法获取卸载包的广播,这可能会导致系统不一致。请参阅此 答案

0

Lookout Mobile在其博客中提到了DigiNotar事件,并提供了一些相当好的(即:冗长的)说明,您可以在此处找到。

要点是您需要提取/system/etc/security/cacerts.bks,然后从存储库中删除CA,然后将存储库推回设备并重新启动。他们的说明要求您具有Bouncy Castle(用于解密存储库),root访问权限和工作adb连接。我不确定这是否适用于所有版本的Android,但我的猜测是CA存储库的位置很长时间以来(如果有的话)没有改变。


你能给我 LookOut Mobile 关于这个问题的博客链接吗? - Durai Amuthan.H

0
据我所知,只有一种广播可以告知卸载已完成,即ACTION_PACKAGE_REMOVED
在卸载应用程序 MyCertApp 后,将广播事件ACTION_PACKAGE_REMOVED发送出去。在此时,处理ACTION_PACKAGE_REMOVED的代码已经不存在于 MyCertApp 中。
您可以通过第二个独立的仍然存在的应用程序进行后处理,并在接收到 MyCertApp 被卸载后卸载自身。
另一个假设的解决方案可能是,您的应用程序有一个菜单项“卸载 MyCertApp”。我不知道一个应用程序是否可以自行卸载。

正如你所说,我们可以使用第二个应用程序捕获广播的意图,但这不是正确的方法。未经用户许可而卸载第三方应用程序是不被允许的。(https://dev59.com/0Wkv5IYBdhLWcg3wnB47#10483669) - Durai Amuthan.H
@Durai 我同意第二个卸载应用程序“不是正确的方法”,尽管卸载程序只会卸载自身(另一个应用程序已经被卸载)。 - k3b

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接