使用Android(牛轧糖)和客户端证书的{SSL / HTTPS}

时间:2017-09-04 08:31:12

标签: java android ssl certificate handshake

情况: 我有一个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或更高的任何提示?

0 个答案:

没有答案