情况: 我有一个Airwatch分期付款,为客户提供私人"用户证书"存储在用户专用CA存储中的。在与指定的https Web服务器建立SSL连接时,应使用证书。
E.g。当我尝试通过HTTPS和Chrome访问此Web服务器时,Chrome会找到客户端证书并询问我是否要使用它(所以不要直接使用)。点击" ok"我可以建立连接并查看网站。
问题 在最近的时代"这可以通过向应用程序自身提供物理证书并在运行时加载(通过创建Keystore,Trustmanager和Custom SSLContext)来解决自定义应用程序,如here所述
我虽然使用Android Nougat,但我可以通过仅配置此应用程序的证书所在的位置来摆脱"解决方法"它称为网络安全配置,如此处所述https://developer.android.com/training/articles/security-config.html
所以我补充说:
android:networkSecurityConfig="@xml/network_security_config"
Android Manifest中的,并添加了一个看起来像这样的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>
我虽然使用HttpsURLConnection会在必要时自动使用用户证书。
现状: 我还是这样:
javax.net.ssl.SSLHandshakeException: Handshake failed
问题:
1)我是否还需要创建自定义SSLContext并使用自定义密钥库注入自定义信任管理器?如果必须这样做,我如何获得用户证书?可以通过KeyStore.getInstance("AndroidCAStore");
轻松初始化Defautl系统CA但是如何从用户特定存储中获取密钥以在SSLContext中使用它们?
3)我在网上找不到任何关于如何使用HttpsConnection与客户端证书的例子,这些客户端证书存储在Android上的用户密钥库中,带有Nougat或更高的任何提示?