Android 使用X509TrustManagerExcheckServerTrusted进行公钥固定

Android 使用X509TrustManagerExcheckServerTrusted进行公钥固定,android,x509,tls1.2,trustmanager,public-key-pinning,Android,X509,Tls1.2,Trustmanager,Public Key Pinning,用于HTTPS TLS连接的公钥固定。 安卓API存在一个问题,低于17,在公钥锁定的情况下启用MITM(中间人)攻击。下面的链接对此进行了解释 因此,在低于17的Android minimum sdk中,即低于Android版本4.2,我们需要使用Android密钥库初始化X509TrustManager,该密钥库只有服务器根证书(而不是默认密钥库;该密钥库将在设备中安装所有证书)。这有助于在执行公钥固定之前清除从服务器接收的叶证书 从Android API 17开始,Android引入了X

用于HTTPS TLS连接的公钥固定。

安卓API存在一个问题,低于17,在公钥锁定的情况下启用MITM(中间人)攻击。下面的链接对此进行了解释

因此,在低于17的Android minimum sdk中,即低于Android版本4.2,我们需要使用Android密钥库初始化X509TrustManager,该密钥库只有服务器根证书(而不是默认密钥库;该密钥库将在设备中安装所有证书)。这有助于在执行公钥固定之前清除从服务器接收的叶证书

从Android API 17开始,Android引入了X509TrustManagerExtrains,它在操作系统级别执行此根目录清理

我的问题:

   TrustManagerFactory tmf = TrustManagerFactory.getInstance("X509");
   tmf.init(KeyStore.getInstance(KeyStore.getDefaultType()));

   for (TrustManager trustManager : tmf.getTrustManagers()) {
       X509TrustManagerExtensions tme = new X509TrustManagerExtensions((X509TrustManager) trustManager);
       tme.checkServerTrusted(chain, authType, <<String https://www.example.com>>);
   }
如果有人能提供一个示例,说明如何实现X509TrustManagerExtrains为根目录清理提供的以下方法,我将非常高兴

List<X509Certificate> checkServerTrusted (X509Certificate[] chain, 
                String authType, 
                String host)
例外情况: 找不到证书路径的信任锚点

可能的安全风险: 使用
KeyStore.getDefaultType()


任何帮助都将不胜感激。

首先,您需要使用
TrustManagerFactory
联系trust manager。初始化此文件时,将null传递给它以使用默认的
密钥库
,它将返回默认的信任管理器。然后,您可以使用第一个
X509TrustManager
创建
X509TrustManager

TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(
        TrustManagerFactory.getDefaultAlgorithm());
trustManagerFactory.init((KeyStore) null);

// Find first X509TrustManager in the TrustManagerFactory
X509TrustManager x509TrustManager = null;
for (TrustManager trustManager : trustManagerFactory.getTrustManagers()) {
    if (trustManager instanceof X509TrustManager) {
        x509TrustManager = (X509TrustManager) trustManager;
        break;
    }
}

X509TrustManagerExtensions x509TrustManagerExtensions = 
        new X509TrustManagerExtensions(trustManager());
然后,为了执行此操作,我只成功使用了域部分的主机:

List<X509Certificate> trustedCerts = x509TrustManagerExtensions
        .checkServerTrusted(untrustedCerts, "RSA", "appmattus.com");

如果您使用的是OkHttp,那么您可以只使用已更新的内置版本来修复文章中提到的问题。

是否有原因不能使用>=API 17?“X509TrustManagerExtensions”仅存在于API 17及更高版本中。
Certificate[] serverCerts = ((HttpsUrlConnection)conn).getServerCertificates();
X509Certificate[] untrustedCerts = Arrays.copyOf(serverCerts, 
        serverCerts.length, 
        X509Certificate[].class);