如何使来自Android应用程序的所有HTTP请求接受给定的证书颁发机构?
我有一台运行HTTPS的服务器,服务器上有来自我自己的证书颁发机构的证书。我将CA证书作为如何使来自Android应用程序的所有HTTP请求接受给定的证书颁发机构?,android,https,ssl-certificate,certificate-authority,Android,Https,Ssl Certificate,Certificate Authority,我有一台运行HTTPS的服务器,服务器上有来自我自己的证书颁发机构的证书。我将CA证书作为.pem文件(例如,我可以通过--cacert将其传递给CURL,以使其与我的服务器通信) 我正在编写一个Android应用程序,它需要与这个服务器进行通信。我需要能够以某种方式将此PEM文件提供给它,以便它能够接受由我的CA签署的证书。此应用程序在专用硬件上以特权模式运行,并且不可能让用户通过Android设置UI添加证书本身,就像您可能为传统应用程序所做的那样。我需要在Java中以编程方式添加CA,如果
.pem
文件(例如,我可以通过--cacert
将其传递给CURL,以使其与我的服务器通信)
我正在编写一个Android应用程序,它需要与这个服务器进行通信。我需要能够以某种方式将此PEM文件提供给它,以便它能够接受由我的CA签署的证书。此应用程序在专用硬件上以特权模式运行,并且不可能让用户通过Android设置UI添加证书本身,就像您可能为传统应用程序所做的那样。我需要在Java中以编程方式添加CA,如果更容易的话,也可以在部署时添加CA(该软件作为完整的Android版本部署)
我希望能够在一个地方添加CA,然后从应用程序发出的任何HTTPS请求都将接受CA,无论它们使用的是哪个库或客户端。我不想通过整个应用程序配置每个请求来接受CA,我们使用了几个库,我不想弄清楚如何配置每个库
请注意,我不需要整个设备来信任CA,只需要我的应用程序
这可能吗?根据,网络安全配置功能使用一个XML文件,您可以在其中指定应用程序的设置。您必须在应用程序清单中包含指向此文件的条目。下面从清单中摘录的代码演示了如何创建此条目:
<?xml version="1.0" encoding="utf-8"?>
<manifest ... >
<application android:networkSecurityConfig="@xml/network_security_config"
... >
...
</application>
</manifest>
...
res/xml/network\u security\u config.xml:
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<domain-config>
<domain includeSubdomains="true">example.com</domain>
<trust-anchors>
<certificates src="@raw/my_ca"/>
</trust-anchors>
</domain-config>
</network-security-config>
example.com
将您的PEM证书文件添加到res/raw/my_ca。根据,网络安全配置功能使用XML文件,您可以在其中指定应用程序的设置。您必须在应用程序清单中包含指向此文件的条目。下面从清单中摘录的代码演示了如何创建此条目:
<?xml version="1.0" encoding="utf-8"?>
<manifest ... >
<application android:networkSecurityConfig="@xml/network_security_config"
... >
...
</application>
</manifest>
...
res/xml/network\u security\u config.xml:
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<domain-config>
<domain includeSubdomains="true">example.com</domain>
<trust-anchors>
<certificates src="@raw/my_ca"/>
</trust-anchors>
</domain-config>
</network-security-config>
example.com
将您的PEM证书文件添加到res/raw/my_ca。不幸的是,这需要API级别24,而我在21上。@较旧的设备将忽略此配置。在具有API 24+ist的设备上将有效。唯一的替代方法是实现自定义TrustManager并使用自定义信任存储初始化它:您也可以检查这一点。不幸的是,这需要API级别24,而我在21上。@较旧的设备将忽略此配置。在具有API 24+ist的设备上将有效。唯一的替代方法是实现一个定制的TrustManager,并用一个定制的信任存储初始化它:您也可以检查这一点