Android X509TrustManager#checkServerTrusted在API>上抛出CertificateException 23

时间:2017-05-17 12:09:47

标签: android security ssl x509

我正在尝试将自签名证书导入受信任的证书,以便默认浏览器接受与使用它的网站的连接。

使用https://github.com/bitfireAT/cadroid中的代码,可以通过X509TrustManager#checkServerTrusted()进行检查,该检查适用于API 23,但不适用于API 24/25(由targetSdkVersion设置)。

public boolean isTrusted() throws NoSuchAlgorithmException, KeyStoreException {
    TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
    tmf.init((KeyStore) null);
    X509TrustManager tm = (X509TrustManager) tmf.getTrustManagers()[0];

    try {
        tm.checkServerTrusted(certificates, certificates[0].getPublicKey().getAlgorithm());
        return true;
    } catch (CertificateException e) {
        return false;
    }
}

证书已成功导入并受信任(由浏览器验证/它显示在系统设置>安全> CA证书中),因此它不应抛出异常(并且不会在API 23上)。

我发现Android 7.0上的唯一变化是没有提及任何相关内容(https://developer.android.com/about/versions/nougat/android-7.0-changes.html#tls-ssl)。

任何想法,如何检查证书是否在API上受信任> 23?

1 个答案:

答案 0 :(得分:0)

我刚刚找到https://stackoverflow.com/a/38770284/2170109来解决我的问题。

  

默认情况下,所有应用程序的安全连接(使用TLS和HTTPS等协议)都信任预安装的系统CA,而面向Android 6.0(API级别23)及更低版本的应用程序默认也信任用户添加的CA存储。

所以我需要在清单中包含networkSecurityConfig并允许用户证书。