【问题标题】:How to delete user installed certificate programmatically?如何以编程方式删除用户安装的证书?
【发布时间】:2015-07-31 08:43:45
【问题描述】:

我以编程方式安装了证书。

我可以通过Settings -> Security -> Trusted Credentials -> User -> Choose the certificate and click the remove button手动卸载它

我想以编程方式删除证书。

这是我尝试过但不起作用的代码。

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

参考我为什么选择deleteEntry

这是我得到的错误日志

05-19 18:27:40.789: W/System.err(14588): java.lang.UnsupportedOperationException
05-19 18:27:40.792: W/System.err(14588):    at com.android.org.conscrypt.TrustedCertificateKeyStoreSpi.engineDeleteEntry(TrustedCertificateKeyStoreSpi.java:82)
05-19 18:27:40.792: W/System.err(14588):    at java.security.KeyStore.deleteEntry(KeyStore.java:410)
05-19 18:27:40.792: W/System.err(14588):    at com.proj.test.MyActivity$4.onClick(MyActivity.java:336)
05-19 18:27:40.792: W/System.err(14588):    at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:162)
05-19 18:27:40.792: W/System.err(14588):    at android.os.Handler.dispatchMessage(Handler.java:102)
05-19 18:27:40.792: W/System.err(14588):    at android.os.Looper.loop(Looper.java:135)
05-19 18:27:40.793: W/System.err(14588):    at android.app.ActivityThread.main(ActivityThread.java:5254)
05-19 18:27:40.793: W/System.err(14588):    at java.lang.reflect.Method.invoke(Native Method)
05-19 18:27:40.794: W/System.err(14588):    at java.lang.reflect.Method.invoke(Method.java:372)
05-19 18:27:40.794: W/System.err(14588):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
05-19 18:27:40.794: W/System.err(14588):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)

这个问题和我的另一个question有点关系

感谢任何帮助!

【问题讨论】:

标签: java android ssl-certificate


【解决方案1】:

看起来 KeyStoreSpi 接口的实现不支持删除:

@Override
public void engineDeleteEntry(String alias) {
    throw new UnsupportedOperationException();
}

https://android.googlesource.com/platform/external/conscrypt/+/master/src/platform/java/org/conscrypt/TrustedCertificateKeyStoreSpi.java#81

【讨论】:

  • 那么就没有办法以编程方式删除已安装的证书吗?
  • 可能不是来自普通用户应用程序。不过你可以看看 Android 设置是怎么做的:grepcode.com/file/repository.grepcode.com/java/ext/…
  • 我无法导入IKeyChainServiceKeyChainConnection ..我得到无法解析符号错误。
  • 出于安全原因可能已完成。也就是说,Android 模拟了一个威胁,其中坏人以编程方式删除了证书并在用户、站点或服务上引发了 DoS。缓解措施是删除程序接口。也许允许修改存储(插入和删除)会更好,但需要用户确认。
  • @jww - 就像Keychain 中的installintent 一样,他们本可以提供一些uninstallintent,这将由用户自行决定
【解决方案2】:

您可以在 Android 5.x 中使用uninstallCaCert() 方法与设备所有者一起执行此操作。但是,只能在配置设备之前安装设备所有者。

https://developer.android.com/reference/android/app/admin/DevicePolicyManager.html#uninstallCaCert(android.content.ComponentName, 字节[])

【讨论】:

  • 可以使用TrustedCertificateStore类和deleteCertificateEntry吗?你的blog on ICS Trust Store 提到了TrustedCertificateStore
  • 简答:不。长回答:没有系统级权限,您不能乱用系统文件。您可能可以使用 root 访问权限做一些事情,但通常不是好主意。不确定应用程序的作用,但如果证书仅由您的应用程序使用,则根本不要将其安装在系统商店中。
  • @Durai:“为了检查 SSL 流量,我们正在做 SSL 穿刺......” - 我只是在向 TLS 工作组的人们评论这件事。或者更准确地说,是由于网络/浏览器安全模型造成的标准污染。见TLS: prohibit <1.2 on clients (but allow servers)
  • @DuraiAmuthan.H 你为什么要首先检查流量?我称之为 MiTM 攻击。
  • 不确定“VPN 应用程序”是什么意思,但 VPN 肯定不需要检查 SSL 流量。
猜你喜欢
  • 2011-09-11
  • 2012-09-29
  • 2020-06-12
  • 2011-07-02
  • 2010-11-28
  • 2012-10-09
  • 1970-01-01
  • 2010-10-27
  • 2010-12-01
相关资源
最近更新 更多