让 SSL 证书在 API 中工作(添加自定义 SSL 证书)
Getting SSL Certificates to work in API (Adding Custom SSL Certificates)
我正在尝试使用 Volley Libary 从 JSON API 加载数据,这在使用 API 级别 30 时工作正常,但是当我尝试使用设备 运行ning 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
}
))
正如@derpirscher 在评论中指出的那样,问题在于 API 级别 <25 不接受 Let's Encrypt 使用的根证书。
在我添加我的解决方法之前,我应该说我不是专业人士,所以你不应该只是复制我的东西。
我选择的解决方法是手动将此证书添加到我的应用程序中的已接受证书中,如下所示。 (文档中的文章可以找到(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 清单中使用此配置。为此,您必须将以下属性添加到您的标签
android:networkSecurityConfig="@xml/network_security_config"
(将@xml/network_security_config 替换为您的配置位置)
然后您还必须添加实际的证书。因为它不会在 XML 中,您应该首先将一个原始目录添加到您项目的 res 文件夹中,因为如果您只是将证书放在 res 文件夹中,它可能无法工作。有了文件夹后,下载证书(this 应该是下载 Link,但你可能应该自己下载 link 而不是只相信互联网上的某些人 :D ) 并将其放入创建的文件夹中。如果您在网络配置中遇到错误,请检查证书文件是否正确命名。
我正在尝试使用 Volley Libary 从 JSON API 加载数据,这在使用 API 级别 30 时工作正常,但是当我尝试使用设备 运行ning 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
}
))
正如@derpirscher 在评论中指出的那样,问题在于 API 级别 <25 不接受 Let's Encrypt 使用的根证书。
在我添加我的解决方法之前,我应该说我不是专业人士,所以你不应该只是复制我的东西。
我选择的解决方法是手动将此证书添加到我的应用程序中的已接受证书中,如下所示。 (文档中的文章可以找到(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 清单中使用此配置。为此,您必须将以下属性添加到您的标签
android:networkSecurityConfig="@xml/network_security_config"
(将@xml/network_security_config 替换为您的配置位置)
然后您还必须添加实际的证书。因为它不会在 XML 中,您应该首先将一个原始目录添加到您项目的 res 文件夹中,因为如果您只是将证书放在 res 文件夹中,它可能无法工作。有了文件夹后,下载证书(this 应该是下载 Link,但你可能应该自己下载 link 而不是只相信互联网上的某些人 :D ) 并将其放入创建的文件夹中。如果您在网络配置中遇到错误,请检查证书文件是否正确命名。