【问题标题】:Getting SSL Certificates to work in API (Adding Custom SSL Certificates)让 SSL 证书在 API 中工作(添加自定义 SSL 证书)
【发布时间】:2021-12-20 04:12:42
【问题描述】:

我正在尝试使用 Volley Libary 从 JSON API 加载数据,这在使用 API 级别 30 时工作得很好,但是当我尝试在运行 API 级别 24 的设备上使用该应用程序时,我收到以下错误:

Request failed: javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.

我已经阅读了this Post 关于类似问题的文章,但对我来说,更改 Web 服务器的配置不是一个选项,因为它在 API 级别 30 及以上的设备(以及我尝试过的每个浏览器)上都可以正常工作证书没有问题),我认为问题可能出在其他地方。为了在旧版本的 Android 上运行,我需要进行什么不同的配置吗?

顺便说一句,这是我用于 API 请求的代码(显然我更改了一些东西,例如 URL 以及我如何处理我返回的东西,但这可能不会对我遇到的问题产生影响应该没问题)

val requestQueue = Volley.newRequestQueue(this.context)

requestQueue.add(JsonArrayRequest("https://subdomain.the.url",
      { response ->
          //Handle Response
      },
      { volleyError ->
          //Handle Errors
      }
))

【问题讨论】:

  • 有没有机会,证书是最近由letsencrypt颁发的?然后,您可能会提供一个植根于其自签名 isrg 根的证书链,Android 设备 不信任该证书链
  • 从十月开始,大概是这样,谢谢。只是出于好奇,为什么较新的 API 仍然接受它们?我希望这样的更改只会影响较旧的 API 级别或所有 API 级别
  • 从 Android 7.1.1 开始,“新”(到现在已经 6 年多了)根证书是 Android 信任库的一部分。因此,自 Android 7.1.1 以来,所有以该证书为根的证书链都受到任何设备的信任。所有旧设备的信任存储中都没有该根证书,因此它们无法验证该证书的可信来源。跨度>

标签: kotlin ssl android-volley


【解决方案1】:

正如@derpirscher 在评论中指出的那样,问题在于 API 级别

在我添加我的解决方法之前,我应该说我不是专业人士,所以你不应该只是复制我的东西。

我选择的解决方法是手动将此证书添加到我的应用程序中接受的证书中,如下所示。 (文档中的文章可以找到(The Article in the Documentation can be found here) 为此,您首先必须添加一个网络安全配置,在我的例子中包含以下内容:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config>
        <trust-anchors>
            <certificates src="@raw/isrg_root_x1"/>
            <certificates src="system"/>
        </trust-anchors>
    </base-config>
</network-security-config>

请注意,我信任两件事:首先是 ISRG 根 X1 证书,它是所描述问题的原因,还有 Android 默认信任的标准证书。

然后您必须告诉 Android 在您的 Android Manifest 中使用此配置。为此,您必须在标签中添加以下属性

android:networkSecurityConfig="@xml/network_security_config"

(将@xml/network_security_config 替换为您的配置位置)

您还必须添加实际的证书。由于这不会在 XML 中,因此您应该首先将原始目录添加到项目的 res 文件夹中,因为如果您只是将证书放在 res 文件夹中,它可能不会起作用。当您拥有该文件夹时,下载证书(this 应该是下载链接,但您可能应该自己获取下载链接,而不仅仅是信任 Internet 上的某个人:D)并将其放入创建的文件夹中。如果您在网络配置中遇到错误,请检查证书文件是否正确命名。

【讨论】:

    猜你喜欢
    • 2019-07-21
    • 2021-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 2019-03-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多