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

Posted

技术标签:

【中文标题】如何在卸载应用程序时删除应用程序安装的受信任 CA 证书【英文标题】:How to remove App installed trusted CA cert on uninstalling the App 【发布时间】:2015-07-26 11:55:00 【问题描述】:

我有一个应用程序提供安装 CA 证书的选项,它存储在 Trusted Credentials 的用户选项卡中,并且按预期工作。

仅供参考 (这是我安装证书的方式):

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);

如果应用已卸载,则证书仍保留在受信任的凭据中

我希望在卸载应用程序时卸载证书。

我想过使用KeyStore 的deleteEntry 方法删除证书。

仅供参考 (虽然我还没有测试过。希望它应该可以工作。我会在测试后更新)

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)

                                
                            
                          

即使您认为上述代码有效,我也无法注册广播接收器以卸载我自己的应用程序。

我如何才能在卸载我的应用时删除我的应用安装的证书?

感谢任何帮助!

【问题讨论】:

没有办法做到这一点,正是因为卸载过程不是由您的代码处理的。 Android就是这样设计的。您只能希望用户不会忘记明确地执行此操作。 @SargeBorsch - 你确定吗?..但是密钥库提供了一个公共 API goo.gl/bDbiaI 据我所知,没有办法监听应用程序的卸载事件。但是,您可以通过定期发送“你在吗?”来找到跟踪分析的方法。带有推送服务的消息(没有答案=已卸载逻辑。是的,很糟糕)。但它仍然不能解决您删除证书的问题。我也想知道有没有办法解决这个问题 @Ercan - 当然,如果我找到任何解决方案,我会告诉你 【参考方案1】:

据我所知,只有一个广播告诉卸载已完成ACTION_PACKAGE_REMOVED

卸载应用程序 MyCertApp 后,将广播事件 ACTION_PACKAGE_REMOVED。在 MyCertApp 中处理 ACTION_PACKAGE_REMOVED 的代码当时已经消失了。

您只能使用第二个独立应用程序进行后处理,该应用程序仍然存在并且可以在收到 MyCertApp 消失后自行卸载。

另一个假设的解决方案可能是您的应用有一个菜单项“卸载 MyCertApp”。我不知道一个应用是否可以卸载它的elt

【讨论】:

正如你所说,我们可以使用第二个应用程序捕获广播的意图,但这不是正确的方法。第三方应用不允许未经用户许可卸载(***.com/a/10483669/730807) @Durai 我同意第二个卸载应用程序“它不是正确的方法”,尽管卸载程序只会卸载自己(其他应用程序已被卸载。)【参考方案2】:

由于 DigiNotar 事件,Lookout Mobile 已在博客中对此进行了讨论,并提供了一些非常好的(阅读:冗长的)说明,您可以在此处找到。

它的要点是你需要拉 /system/etc/security/cacerts.bks 然后从存储中删除 CA,然后将存储推回设备并重新启动。他们的说明要求您拥有 Bouncy Castle(用于解密存储)、root 访问权限和有效的 adb 连接。我不确定这是否适用于所有版本的 Android,但我的猜测是 CA 商店的位置在很长一段时间内都没有改变(如果有的话)。

【讨论】:

你能给我关于这个问题的 LookOut Mobile 博客链接吗?【参考方案3】:

您无法获得为您自己的软件包卸载软件包的广播。 这可能会导致系统不一致。 看到这个answer

【讨论】:

以上是关于如何在卸载应用程序时删除应用程序安装的受信任 CA 证书的主要内容,如果未能解决你的问题,请参考以下文章

将新的受信任 CA 添加到 Azure 上的证书颁发机构证书存储区

无法为 com.adobe.adept.client.XMLUtil 的受信任 CA 设置证书

Azure 应用服务上的受信任根证书

如何通过 Visual Studio 2019、2017 和 2015 为 Windows 10 UWP 应用程序创建有效的受信任和/或自签名证书

如何在 Android 设备上安装受信任的 CA 证书?

Win软件 - (Net-Framework)已处理证书链,但是在不受信任提供程序信任的根证书中终止