Java 带有Android(Nougat)和客户端证书的SSL/HTTPS
情况: 我有一个Airwatch分期付款,它为客户机提供存储在用户私有CA存储中的私有“用户证书”。在建立到指定https Web服务器的SSL连接时,应使用证书 例如,当我尝试通过HTTPS和Chrome访问此Web服务器时,Chrome会找到客户端证书,并询问我是否要使用它(所以不是直接使用)。通过单击“确定”,我可以建立连接并查看站点 问题 在“最近的时代”,这可以通过向应用程序本身提供物理证书并在运行时加载(通过创建密钥库、信任管理器和自定义SSLContext)在自定义应用程序中解决,如前所述 我认为使用Android Nougat,我可以通过只配置此应用程序的证书所在位置来摆脱“变通方法”。它被称为网络安全配置,如下所述 所以我补充说:Java 带有Android(Nougat)和客户端证书的SSL/HTTPS,java,android,ssl,certificate,handshake,Java,Android,Ssl,Certificate,Handshake,情况: 我有一个Airwatch分期付款,它为客户机提供存储在用户私有CA存储中的私有“用户证书”。在建立到指定https Web服务器的SSL连接时,应使用证书 例如,当我尝试通过HTTPS和Chrome访问此Web服务器时,Chrome会找到客户端证书,并询问我是否要使用它(所以不是直接使用)。通过单击“确定”,我可以建立连接并查看站点 问题 在“最近的时代”,这可以通过向应用程序本身提供物理证书并在运行时加载(通过创建密钥库、信任管理器和自定义SSLContext)在自定义应用程序中解决,
android:networkSecurityConfig="@xml/network_security_config"
在Android清单中,添加了一个如下所示的XML
<network-security-config>
<base-config>
<!-- Trust ONLY the mydomain.com Domain and its Subdomains -->
<domain includeSubdomains="true">mydomain.com</domain>
<trust-anchors>
<!-- Trust preinstalled CAs -->
<certificates src="system"/>
<!-- Additionally trust user added CAs -->
<certificates src="user"/>
</trust-anchors>
</base-config>
</network-security-config>
问题:
1) 我是否仍然需要创建自定义SSLContext并向自定义Trustmanager注入自定义密钥库?如果必须这样做,我如何获得用户证书?可以通过KeyStore.getInstance(“AndroidCAStore”)轻松初始化Defautl系统CAs
但是如何从特定于用户的存储中获取密钥以在SSLContext中使用它们呢
3) 我在网上没有找到任何关于如何使用HttpsConnection和客户端证书的例子,这些证书存储在Android上的用户密钥库中,并带有Nougat或更高版本,有什么提示吗?这应该有助于您阅读(注释和答案)?
javax.net.ssl.SSLHandshakeException: Handshake failed