细粒度X509证书检查和TrustManagerFactory初始化

时间:2018-04-04 08:59:43

标签: android ssl x509certificate jsse trustmanager

我正在尝试在我的Android应用程序中配置https客户端,该客户端将对从服务器收到的证书链执行细粒度检查。

更确切地说,我想检查一下:

  • 如果链包含给定的CA证书(自定义CA)
  • 通用名称的值和链终端证书的组织名称

我可以通过使用正确构造的CertPathTrustManagerParameters初始化TrustManagerFactory来完成,但是这段代码片段的第二行:

TrustManagerFactory tmf = 
TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());

tmf.init(new CertPathTrustManagerParameters(pkixBuilderParameters));

抛出以下异常:

 Unsupported spec: javax.net.ssl.CertPathTrustManagerParameters@634b748. 
 Only android.security.net.config.RootTrustManagerFactorySpi$ApplicationConfigParameters supported.

从这篇文章:https://security.stackexchange.com/questions/83372/what-is-the-difference-of-trustmanager-pkix-and-sunx509 我知道Android JSSE提供程序可能不支持使用CertPathTrustManagerParameters进行TrustManagerFactory初始化。

我想知道是否可以在Android上使用CertPathTrustManagerParameters初始化TrustManagerFactory。

我的问题的备份解决方案是使用包含我的CA证书的KeyStore初始化TrustManagerFactory并覆盖生成的TrustManager的 checkServerTrusted(X509Certificate [] chain,String authType)函数,添加对组织的检查和俗名。

注意:

无论调用

时指定的算法如何
 TrustManagerFactory tmf = TrustManagerFactory.getInstance(String algorithm)

返回的TrustManagerFactory对象始终使用 RootTrustManagerFactorySpi 设置为TrustManagerFactorySpi。

然后,功能

tmf.init(new CertPathTrustManagerParameters(pkixBuilderParameters))

在RootTrustManagerFactorySpi中调用以下函数:

@Override
public void engineInit(ManagerFactoryParameters spec)
        throws InvalidAlgorithmParameterException {
    if (!(spec instanceof ApplicationConfigParameters)) {
        throw new InvalidAlgorithmParameterException("Unsupported spec: " +  spec + ". Only "
                + ApplicationConfigParameters.class.getName() + " supported");

    }
    mApplicationConfig = ((ApplicationConfigParameters) spec).config;
}

这表明,当使用 ManagerFactoryParameters 进行初始化时,TrustManagerFactory仅接受 ApplicationConfigParameters 提供并拒绝 CertPathTrustManagerParameters (两者都是子类ManagerFactoryParameters)

0 个答案:

没有答案