【问题标题】:How to find trusted certificate for both Android and iOS?如何找到适用于 Android 和 iOS 的受信任证书?
【发布时间】:2016-07-15 05:55:49
【问题描述】:

免责声明这是自问自答问题

当我们的客户购买了在 iOS 上被视为“受信任”的证书时,我曾多次遇到过这种情况,但不幸的是,它在 Android 上不起作用。

是什么原因,如何解决?

【问题讨论】:

  • 这是真的,SO 不是博客文章服务,但它的目的是帮助找到问题的答案。这是这个平台的商业价值。我相信这篇文章符合 SO 的格式,并为正在寻找问题答案的用户带来价值
  • 我认为我们对 SO 的目标赋予了不同的含义,这就是我们面临难以达成一致的原因。正如欢迎页面所说:“在您的帮助下,我们正在共同努力构建一个包含有关编程的每个问题的详细答案的库。”在满足“关于编程的问答”的标准之前,欢迎所有帖子。所以有简短的答案、详细的答案,甚至是 wiki——服务不会限制我们回答问题的方式。也许,找到这样的真正问题会更好,但我尝试过但没有找到,这就是为什么我在遇到这个问题时创建自己的问题。

标签: android ios certificate truststore


【解决方案1】:

简短的回答是购买通用可信证书。

原因是 Android 设备上的信任库包含不同的可信证书集——IOS 和 Android 可信证书不同。

可以在集合上描述:
A -- android 可信证书
I -- iOS 可信证书
AI——可信证书的交集

因此,我们需要这两个平台的交集。

但是,这个问题变得更加复杂,因为可信证书集因 Android 和 iOS 的操作系统版本而异。这意味着我们将需要查看所有受支持的平台及其所有受支持的版本,以找到一组通用的受支持证书。

对于 iOS,可在其官方网站 list of supported iOS certificates 上找到受信任证书列表

对于 Android,我没有找到相同的列表,但可以通过下面的代码从运行时获取它。

 public List<CertificateDto> getCertificates() {
        List<CertificateDto> result = new ArrayList<>();
        try {
            String algorithm = TrustManagerFactory.getDefaultAlgorithm();
            TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(algorithm);
            trustManagerFactory.init((KeyStore) null);

            X509TrustManager xtm = (X509TrustManager) trustManagerFactory.getTrustManagers()[0];
            for (X509Certificate cert : xtm.getAcceptedIssuers()) {
                PublicKey publicKey = cert.getPublicKey();
                int leyLength = 0;
                if (publicKey instanceof RSAPublicKey) {
                    leyLength = ((RSAPublicKey) publicKey).getModulus().bitLength();
                } else if (publicKey instanceof DSAPublicKey) {
                    leyLength = ((DSAPublicKey) publicKey).getY().bitLength();
                }

                CertNameToValidNameConverter validNameConverter = new CertNameToValidNameConverter();

                CertificateDto certificate = new CertificateDto();
                certificate.setSubjectName(validNameConverter.convert(cert.getSubjectDN().getName()));
                certificate.setIssuerName(validNameConverter.convert(cert.getIssuerDN().getName()));
                certificate.setKeyLength(leyLength);
                certificate.setTypeAlg(cert.getSigAlgName());
                certificate.setExpirationDate(cert.getNotAfter().getTime());

                result.add(certificate);
            }
        } catch (NoSuchAlgorithmException e) {
            Log.e(App.TAG, "Failed obtain list of certificates", e);
        } catch (KeyStoreException e) {
            Log.e(App.TAG, "Failed obtain list of certificates", e);
        }
        return result;
    }

当您从支持的 Android 操作系统获取证书列表时,您需要编写脚本来查看所有证书,并将其与来自不同支持的 Android 版本的另一个列表进行比较,然后再与 iOS 版本进行比较。您将需要比较证书名称、颁发者名称、算法类型、签名算法和密钥长度。到期日期也用于验证,但您可以省略它。

我通过解析 IOS 8,9Android 6.0、4.4 和 4.1 的 excel 证书来实现此脚本。

您可以在下面找到最终的证书列表。从 ~220 个 IOS 证书和 ~150 个证书中,您只能为这两个平台使用 ~65 个证书

list of supported certificates for both Android and iOS (google drive link)

【讨论】:

  • 另外,不要忘记 Microsoft,受信任的证书列表会随着时间的推移而变化。还要注意证书级别,一些平台只会搜索几个级别,如果没有达到根,证书将被拒绝。但答案是从顶级供应商处购买证书。
  • 谢谢!这是有价值的评论。我没有找到 Microsoft 证书列表。如果你能提供源代码,我也会添加与它们的比较,那就太好了。 p.s.并且这个证书列表是顶级的
猜你喜欢
  • 2014-09-18
  • 1970-01-01
  • 2012-02-24
  • 1970-01-01
  • 1970-01-01
  • 2012-07-05
  • 2016-01-17
  • 1970-01-01
  • 2011-04-14
相关资源
最近更新 更多