首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Volley信任其他根证书

Volley信任其他根证书
EN

Stack Overflow用户
提问于 2021-03-29 18:16:49
回答 1查看 39关注 0票数 0

我对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?

Kind问候Jens

EN

回答 1

Stack Overflow用户

发布于 2021-03-30 16:43:42

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

你分享的链接给了我一个想法,它应该是可能的,但是我从来没有使用过volley,也不能确认它是否真的会工作。所以我会做一次尝试,希望你能测试一下,并在这里分享你的结果。

代码语言:javascript
复制
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的一个实例。接下来,获取android CA存储并提取所有受信任的证书。之后,将所有这些证书添加到您的基本信任存储区,您可以使用它们来创建TrustManagerFactory、SSLContext和SSLSocketFactory。示例中的计数器只是生成某些别名的一种方式,但您可以指定或生成自己的别名。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66852393

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档