用于 HTTPS TLS 连接的公钥固定。
低于 17 的 Android API 存在一个问题,它会在公钥固定的情况下启用 MITM(中间人)攻击。这已在下面的链接中解释。
https://www.cigital.com/blog/ineffective-certificate-pinning-implementations/
因此,在低于 17 的 Android 最小 sdk 中,即低于 Android 版本 4.2,我们需要使用只有服务器根证书的 Android 密钥库初始化X509TrustManager (而不是默认密钥库;它会在设备中安装所有证书)。这有助于在执行公钥固定之前清理从服务器接收到的叶证书。
从 Android API 17 开始,Android 引入了X509TrustManagerExtensions,它在操作系统级别执行此根清理。
https://developer.android.com/reference/android/net/http/X509TrustManagerExtensions.html
我的问题:
如果有人能提供一个示例,说明如何实现 X509TrustManagerExtensions 提供的以下方法以进行根目录清理,我将很高兴。
List<X509Certificate> checkServerTrusted (X509Certificate[] chain,
String authType,
String host)
我对以下内容感到困惑。
host
; 它应该是域 URL 吗?有 https 还是没有?还是应该是完整的 url(域 + 相对路径)如何创建一个瞬间
X509TrustManagerExtensions
?X509TrustManagerExtensions 的构造函数X509TrustManager
作为输入。我们是否使用 android 默认密钥库创建此 X509TrustManager?
代码片段(不工作):
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>>);
}
例外: 未找到证书路径的信任锚
可能的安全风险:
使用KeyStore.getDefaultType()
任何帮助将不胜感激。