将多个 SSL 证书固定添加到 Android KeyStore 不起作用。 (来自资源文件)

2023-11-28

我想将资源文件中的多个 SSL 证书添加到 Android KeyStore,如下所示:

if (sslContext==null) {
        // loading CA from an InputStream
        InputStream is = AVApplication.getContext().getResources().openRawResource(R.raw.wildcard);
        String certificates = Converter.convertStreamToString(is);
        String certificateArray[] = certificates.split("-----BEGIN CERTIFICATE-----");

        for (int i = 1; i < certificateArray.length; i++) {
            certificateArray[i] = "-----BEGIN CERTIFICATE-----" + certificateArray[i];
            //LogAV.d("cert:" + certificateArray[i]);

            // generate input stream for certificate factory
            InputStream stream = IOUtils.toInputStream(certificateArray[i]);

            // CertificateFactory
            CertificateFactory cf = CertificateFactory.getInstance("X.509");
            // certificate
            Certificate ca;
            try {
                ca = cf.generateCertificate(stream);
            } finally {
                is.close();
            }

            // creating a KeyStore containing our trusted CAs
            KeyStore ks = KeyStore.getInstance("BKS");
            ks.load(null, null);
            ks.setCertificateEntry("av-ca" + i, ca);

            // TrustManagerFactory
            String algorithm = TrustManagerFactory.getDefaultAlgorithm();
            TrustManagerFactory tmf = TrustManagerFactory.getInstance(algorithm);
            // Create a TrustManager that trusts the CAs in our KeyStore
            tmf.init(ks);

            // Create a SSLContext with the certificate that uses tmf (TrustManager)
            sslContext = SSLContext.getInstance("TLS");
            sslContext.init(null, tmf.getTrustManagers(), new SecureRandom());
        }

    }

    return sslContext;

只有文件的最后一个证书有效! 看来该证书会覆盖另一个证书。

文件看起来像:

-----BEGIN CERTIFICATE-----
    cert 
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
    cert 
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
    cert 
-----END CERTIFICATE-----

我希望有人能帮助我! :)


感谢@Dan Getz,现在可以了。

1. 使用 SSL 上下文和自签名证书的解决方案:

public static SSLContext getSSLContext() throws Exception {
        if (sslContext==null) {
            // loading CA from an InputStream
            InputStream is = AVApplication.getContext().getResources().openRawResource(R.raw.certificates);
            String certificates = Converter.convertStreamToString(is);
            String certificateArray[] = certificates.split("-----BEGIN CERTIFICATE-----");

            // creating a KeyStore containing our trusted CAs
            KeyStore ks = KeyStore.getInstance("BKS");
            ks.load(null, null);
            for (int i = 1; i < certificateArray.length; i++) {
                certificateArray[i] = "-----BEGIN CERTIFICATE-----" + certificateArray[i];
                //LogAV.d("cert:" + certificateArray[i]);

                // generate input stream for certificate factory
                InputStream stream = IOUtils.toInputStream(certificateArray[i]);

                // CertificateFactory
                CertificateFactory cf = CertificateFactory.getInstance("X.509");
                // certificate
                Certificate ca;
                try {
                    ca = cf.generateCertificate(stream);
                } finally {
                    is.close();
                }

                ks.setCertificateEntry("av-ca" + i, ca);
            }
            // TrustManagerFactory
            String algorithm = TrustManagerFactory.getDefaultAlgorithm();
            TrustManagerFactory tmf = TrustManagerFactory.getInstance(algorithm);
            // Create a TrustManager that trusts the CAs in our KeyStore
            tmf.init(ks);

            // Create a SSLContext with the certificate that uses tmf (TrustManager)
            sslContext = SSLContext.getInstance("TLS");
            sslContext.init(null, tmf.getTrustManagers(), new SecureRandom());
        }

        return sslContext;
    }

然后使用 SSL 上下文:

client = okHttpClient.newBuilder()
         .sslSocketFactory(getSslContext(context).getSocketFactory())
         .build();

2. 通过指纹使用 OkHttp 固定非根证书的解决方案:

固定一个non根CA,我正在使用CertificatePinner来自 OkHttp(!这不适用于自签名证书 - 根 CA):

CertificatePinner = new CertificatePinner.Builder()
            .add(new URL(url).getHost(), "sha256/<certificate1 fingerprint [base64]>")
            .add(new URL(url).getHost(), "sha256/<certificate2 fingerprint [base64]>")
            .build();
OkHttpClient client;
    client = okHttpClient.newBuilder()
        .certificatePinner(certificatePinner)
        .build();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将多个 SSL 证书固定添加到 Android KeyStore 不起作用。 (来自资源文件) 的相关文章

  • Android Google 地图:隐藏整个地图的多边形或形状

    我试图隐藏除一个区域之外的整个地图 因为我使用的多边形在我想要显示的区域中有一个洞 问题在于 根据缩放的不同 空白区域会被多边形的颜色覆盖 或者多边形会失去其颜色 这是代码 polygon hide all world map float
  • Android 上的自定义视图和窗口属性

    我想要做的是在我的应用程序顶部添加一个视图 该视图类似于过滤器视图 我想操纵屏幕的颜色 并且我还希望能够同时更改屏幕的亮度时间 这两件事似乎是分开起作用的 但不能一起起作用 这是我的代码 添加视图 colourView new Layer
  • 添加和完成 PHP 源代码文档的工具 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我有几个已完成的较旧的 PHP 项目 其中有很多内容 我想以 javadoc phpDocumentor
  • Google Analytics 点击已发送,但在 Analytics 控制台上不可见

    我一直在尝试按照 Google 官方文档中的步骤在我的应用程序中实现 Google Analytics 完成编码部分后 我转到分析控制台以查看是否收到任何点击 我等了将近2天 但没有看到任何进展 然后我尝试在 logcat 中使用 GAv4
  • Java Timer 类:如果其中一个任务抛出异常,则计时器任务停止执行

    new Timer scheduleAtFixedRate new TimerTask Override public void run System out println run throw new SomeRandomExceptio
  • 基于Java模式分割字符串

    您好 我有以下模式的日志文件 2014 03 06 03 21 45 432 ERROR mfs pool 3 thread 19 dispatcher StatusNotification Error processing notific
  • gradle 复制为 doLast 不起作用

    我正在尝试做一件非常简单的事情 由于 gradle 在清理时会删除构建目录中的所有文件 因此我想在创建发布版本时将 apk 移至其他位置 所以我在链中添加了一个复制任务 并将其设置为最后一个 我尝试过的任何方法都不起作用 所以我简化了它并添
  • 蓝牙权限在 jetpack compose 中无法正常工作

    我在用com google accompanist accompanist permissions 0 25 1在我的项目中 我正在尝试在运行时请求蓝牙权限 我想知道用户如何知道权限被永久禁用 清单 xml
  • 未从线程接收位置数据

    我尝试使用计时器经常发送包含用户位置的短信 最初 我遇到了空指针异常 这是由于我犯了一个简单的错误 一旦解决了这个问题 一切似乎都运行良好 但是 它永远不会获取我的位置 因此 不断发送的文本显示 无法接收位置 我想问的是为什么它无法获取我的
  • 如何获取 Android 应用程序的 Google Places API 密钥

    在过去的 48 小时里 我绞尽脑汁试图找到这个问题的答案 问这个问题的人 如何为 Google Places api 制作 API KEY https stackoverflow com questions 23128152 how can
  • 不想保留一对一的实体

    假设我有两节课Employee and Department In Employee我已经写了 OneToOne fetch FetchType EAGER cascade CascadeType ALL JoinColumn name d
  • Android 数据绑定:可以绑定 HashMap 中的值

    我将对象的字段 字符串 整数等 绑定到布局文件 例如
  • Android Studio gradle 构建时间太长

    My 安卓工作室项目过去构建速度更快 但现在需要很长时间才能构建 有什么想法可能导致延误吗 我努力了https stackoverflow com a 27171878 391401 https stackoverflow com a 27
  • JSF“总”变量类似于 JSTL 中的 c:set

    我不喜欢 JSF 但我需要用它来解决这个问题 我正在 纯 JSF 中工作 所以这就是我基本上需要的 但我不知道如何用 JSF 来实现它
  • System.out.println("嗨"+6+10);打印Hi610?

    为什么要这样做 太令人困惑了 运算符优先级和结合性 两点 操作员 如果一个或两个参数都是字符串 则进行字符串连接 操作员 从左到右工作 所以在你的例子中 Hi 6 is Hi6 and Hi6 10 is Hi610 编辑 正如您在对另一个
  • 解析 SWIG 接口文件的结构属性

    这是我不久前问过的问题的延续 为通过参数返回的函数创建类型映射 https stackoverflow com questions 12793973 create a typemap for a function that returns
  • 如何设置 commons-logging 来使用 logback?

    我们使用 slf4j logback 并且碰巧有一些使用 commons logging 的第三方库 如何设置它以使用 logback 答案是不要使用 commons logging jar 因为 SLF4J 的设计目的与 commons
  • 从 IntelliJ 运行 JavaFX 应用程序

    Versions openjdk版本 11 0 11 2021 04 20 OpenJDK 运行时环境 build 11 0 11 9 Ubuntu 0ubuntu2 20 10 OpenJDK 64 位服务器虚拟机 内部版本 11 0 1
  • Hibernate 命名查询使用 Like 和 % % 运算符?

    在我的 Hibernate JPA 示例代码中 public List
  • 是什么让热部署成为“难题”?

    在工作中 我们经常遇到这样的问题 永久代内存不足 http www jroller com agileanswers entry preventing java s java lang例外 团队负责人认为这是 JVM 中的一个错误 与代码的

随机推荐

  • 获取对象名称和函数名称

    这实际上是2个问题 1 有没有一种通用的方法来获取实例的类名 所以如果我有一个类 class someClass object 我想要一种内置的方式来给我一个字符串 someClass 2 与函数类似 如果我有 def someFuncti
  • C++ 没有指针或引用的虚函数调用

    据我所知 虚函数调用通常需要指针或引用 所以我对下面的代码感到非常惊讶 include
  • 上传意图函数 Dialogflow V2

    我正在尝试开发一个API来上传意图DialogflowV2 我已经尝试过下面的代码片段 但是如果尝试与它进行通信 它不起作用Dialogflow它确实有效 检测意图 并且确实得到了回复Dialogflow以便查询 允许 我是管理员 gt 服
  • 将 FopFactoryBuilder baseURI 设置为 jar 类路径

    我正在将 Apache FOP 1 0 项目升级到 Apache FOP 2 1 在此项目中 所有必需的文件都打包在 jar 文件中 我添加了新的 FopFactoryBuilder 来生成 FopFactory FopFactoryBui
  • CKEditor4:使文本不同于 HTML

    I add StrInsert plugin to my CKEditor It basically adds a button which in my editor is labeled CRM Field 该按钮的作用是将一个值附加到我
  • 首先将文本小写,然后大写。用CSS可以吗?

    首先将文本小写 然后大写 用CSS可以吗 编辑 示例 HELLO WORLD gt Hello World Edit2 我有一个全部大写的国家 地区列表 例如UNITED KINGDOM 我必须让它看起来像United Kingdom Ye
  • 在 ScrollViewer 中使用 WPF DataGrid 虚拟化

    我知道 DataGrid 支持虚拟化 因此它仅为可见行创建网格单元 但是 这似乎仅在 DataGrid 大小受到限制的情况下才有效 在我的场景中 DataGrid 放置在滚动查看器内 如下所示
  • 如何将 \x00 作为参数传递给程序?

    我有一个小程序 我希望将 shellcode 作为参数传递 在shellcode中 需要传递 x00 我尝试了以下命令 program python c print x01 x00 x00 x00 x9c xd8 xff xbf 但 x00
  • ag-网格行未删除

    我正在尝试从我的 ag Grid 中删除一行 如下所示 let alertRow RowNode this gridApi getRowNode rowIndex console log alertRow this gridApi upda
  • Borland x86 内联汇编器;获取标签的地址?

    我使用 Borland Turbo C 和一些内联汇编代码 因此大概是 Turbo Assembler TASM 风格的汇编代码 我希望做到以下几点 void foo bar void asm mov eax SomeLabel SomeL
  • 原则 2 映射引用唯一键

    基本问题 是否可以使用不引用主键而仅引用唯一键的 Doctrine 来映射关联 扩大的视野 我有一个实体 Participation which may参考2个其他实体 DropoutCause and DischargeType 根据此组
  • 错误:无法为 aiohttp 构建轮子,这是安装基于 pyproject.toml 的项目所必需的

    Python版本 3 11 通过以下方式安装应用程序的依赖项pip install r requirements txt给出以下错误 socket c o build temp linux armv8l cpython 311 aiohtt
  • 如何使用 Azure CLI(az ad 应用程序)创建范围

    使用 Azure CLI 2 x 我找不到在 Azure AD 门户中公开 API 部分下 添加范围 的方法 我所看到的是 如果我在创建应用程序时传递 identifier uris 则会自动设置 APP ID URI 和范围 az ad
  • 为什么在 Flux 应用程序架构中每个实体使用一个存储?

    我正在一个项目中使用reactjs 和flux 架构 我对如何将嵌套数据正确分解为存储以及为什么我应该将数据拆分为多个存储感到有点困惑 为了解释这个问题 我将使用这个例子 想象一个有项目的 Todo 应用程序 每个项目都有任务 每个任务都可
  • 变基合并提交

    假设我的 Git 存储库最初有两个分支 Foo 和 Bar Foo Bar 我创建了第三个分支 FooBar 在其中提交了其他两个分支的合并 Foo FooBar Bar FooBar 现在比 Foo 和 Bar 都领先一项 接下来 我做了
  • jqGrid 中的自定义聚合/分组

    Overview 我需要以某种方式自定义 jqGrid 插件 无论是通过巧妙的技巧 黑客攻击还是修改插件 以支持以下类型的聚合 分组 我将非常感谢 jqGrid 社区关于如何实现这一点的一些想法 Details 聚合 分组的工作原理如下 首
  • 如何在 Windows 窗体应用程序中显示矢量图形 (SVG)?

    有没有办法 最好是控件 在 Windows 窗体应用程序中显示矢量图形 最好是 SVG 我猜这很容易做到WPF 但我不想迁移该项目 GDI Graphics 类可以进行矢量图形 对于 SVG 您可以尝试将其加载到网页浏览器控件
  • C# 在任务栏缩略图上显示按钮

    在 WMP 中 任务栏缩略图上显示了按钮 如何用 C 为我的 winforms 应用程序制作它们 The WindowsAPI代码包包含一个名为ThumbnailToolBarButton您可以使用它来运行此功能 您需要确保每个按钮都有图标
  • 为 geom_vline 添加单独的图例

    我有这个数据框 dput df structure list X c 337L 338L 339L 340L 341L 342L 343L 344L 345L 346L 347L 348L 349L 350L 351L 352L 353L
  • 将多个 SSL 证书固定添加到 Android KeyStore 不起作用。 (来自资源文件)

    我想将资源文件中的多个 SSL 证书添加到 Android KeyStore 如下所示 if sslContext null loading CA from an InputStream InputStream is AVApplicati