【问题标题】:Volley trust additional root certVolley 信任附加根证书
【发布时间】:2021-06-25 09:00:12
【问题描述】:

我对 volley 和 SSL 以及一些旧的 Android 设备有疑问。

问题是我们使用的公开信任的根证书在这些旧设备中没有到位,并且操作系统不再更新,所以我想我会将 CA 添加为文件。我发现了很多关于如何信任单个证书的示例,但我也想继续信任现有的根证书。我只想在我们的应用使用的信任库中添加一些。

这可能吗?在某处有这样的代码示例吗?

编辑: 我检查了以下链接,所有链接都处理自签名或完全自定义的 CA 存储,或者只是禁用我不想做的检查。我想保留默认的 CA 存储,但添加一两个额外的 CA

How to import self-signed SSL certificate to Volley on Android 4.1+

How can I make Android Volley perform HTTPS request, using a certificate self-signed by an Unknown CA?

亲切的问候 延斯

【问题讨论】:

  • 您能否提供一些代码 sn-ps 您目前如何使用 ssl 配置 volley 或者 volley 的基本 ssl 配置是什么,以便我们轻松为您指明正确的方向
  • 我没有添加任何自定义 ssl 配置。只是尝试访问 https:// 网址,却发现它不适用于较旧的 Android 手机。我通过使用设备上的网络浏览器发现它没有根证书。所以我希望能够添加一些额外的受信任的根证书。我将编辑问题以链接到我找到的一些信息
  • 清除,附加链接提供信息。你有什么样的格式需要信任的证书?
  • 这并不重要。如果需要,我可以转换它,但我通常更喜欢使用 pem 编码的证书。

标签: android ssl android-volley


【解决方案1】:

您可以做的是将证书包含在您的应用程序中,并以编程方式加载它并将其提供给您的 volley 客户端。

您分享的链接让我觉得它应该是可能的,但是我从未使用过 volley 并且无法确认它是否真的有效。所以我会做一个尝试,希望你能测试它并在这里分享你的结果。

KeyStore baseTrustStore = KeyStore.getInstance(KeyStore.getDefaultType());
baseTrustStore.load(null, null);

// get your custom certificate(s) from your android device our within your app
// and load it as a certificate object
Certificate myTrustedCertificate = // your additional trusted certificate
baseTrustStore.setCertificateEntry("my-trusted-certificate", myTrustedCertificate);

int counter = 0;

KeyStore systemTrustStore = KeyStore.getInstance("AndroidCAStore");
Enumeration<String> aliases = systemTrustStore.aliases();
while (aliases.hasMoreElements()) {
    String alias = aliases.nextElement();
    if (systemTrustStore.isCertificateEntry(alias)) {
        Certificate certificate = systemTrustStore.getCertificate(alias);
        baseTrustStore.setCertificateEntry("" + counter++, certificate);
    }
}

TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
trustManagerFactory.init(baseTrustStore);
TrustManager[] trustManagers = trustManagerFactory.getTrustManagers();

SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, trustManagers, null);
SSLSocketFactory socketFactory = sslContext.getSocketFactory();

HurlStack hurlStack = new HurlStack(null, socketFactory);
RequestQueue queue = Volley.newRequestQueue(this, hurlStack);

所以我首先创建一个空的信任库,我将在其中添加我想要信任的所有证书。首先添加您在某处拥有的自定义根证书并将其映射到java.security.cert.Certificate 的实例。 Afterwords 获取 android CA 存储并提取所有受信任的证书。后记将所有这些证书添加到您的基础信任库中,您可以使用它来创建 TrustManagerFactory、SSLContext 和 SSLSocketFactory。示例中的计数器只是生成一些别名的一种方式,但您可以指定或生成自己的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-26
    • 2010-10-16
    • 2011-02-24
    • 2016-12-22
    • 2018-06-13
    • 2016-01-20
    • 1970-01-01
    相关资源
    最近更新 更多