【问题标题】:Validate android app certificate验证安卓应用证书
【发布时间】:2016-02-17 08:33:56
【问题描述】:

我想检查安装的 android 应用程序是否具有自签名或受信任的证书。问题是我下面列出的代码为所有已安装(包括 Google 制作的)应用程序引发了 CertificateException。你能帮我找出一个为什么它不能正常工作的问题吗?

    Intent intent = new Intent();
    intent.setAction(Intent.ACTION_VIEW);
    List<ResolveInfo> runningServices = getPackageManager().queryIntentActivities(intent, 0);
    TrustManagerFactory tmf = TrustManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
    KeyStore ks = KeyStore.getInstance("AndroidCaStore");
    ks.load(null, null);
    tmf.init(ks);
    X509TrustManager trustManager = (X509TrustManager)tmf.getTrustManagers()[0];
    PackageManager manager = getPackageManager();
    try {
        for (ResolveInfo runningService : runningServices) {
            PackageInfo info = manager.getPackageInfo(runningService.activityInfo.packageName,
                    PackageManager.GET_SIGNATURES);

            Signature signature = info.signatures[0];
            Signature[] arrSignatures = info.signatures;
            for (Signature sig : arrSignatures) {
                byte[] rawCert = sig.toByteArray();
                InputStream certStream = new ByteArrayInputStream(rawCert);

                CertificateFactory certFactory;
                X509Certificate x509Cert;
                try {
                    certFactory = CertificateFactory.getInstance("X509");
                    x509Cert = (X509Certificate) certFactory.generateCertificate(certStream);
                    trustManager.checkServerTrusted(new X509Certificate[] { x509Cert }, "RSA");
                }
                catch (NoSuchAlgorithmException e) {
                    e.printStackTrace();
                } catch (KeyStoreException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                } catch (CertificateException e) {
                    e.printStackTrace();
                }
            }
        }
    } catch (PackageManager.NameNotFoundException e) {
        e.printStackTrace();
    }

【问题讨论】:

    标签: android security certificate x509 signature


    【解决方案1】:

    答案很明显:我们无法使用受信任的证书链验证 android 应用程序证书(通常 ssl 胆量检查 Web 资源证书),因为它们是自签名的。这就是 checkServerTrusted 函数在此类检查期间引发 CertificateException 的原因。这个book 提供以下信息:

    因为一个进程绑定了一个包名,而一个包名是 与其签名相关,签名在保护数据方面发挥作用 属于一个包。一个包通常用一个签名 自签名 PKI(公钥基础结构)证书。证书 标识包的作者是谁。这些证书需要 不是由证书颁发机构颁发的。这意味着信息 证书中的内容未经任何机构批准或验证。这 意味着可以创建一个证明他们的名字是 谷歌。唯一的保证是这个包名保留给 如果之前没有人在市场上认领过该用户,以及任何 该软件包的后续更新仅提供给该用户 (由该证书标识)。

    【讨论】:

      猜你喜欢
      • 2016-11-22
      • 1970-01-01
      • 2012-10-23
      • 2011-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-06
      相关资源
      最近更新 更多