我正在尝试在我的Android应用程序中配置https客户端,该客户端将对从服务器收到的证书链执行细粒度检查。
更确切地说,我想检查一下:
我可以通过使用正确构造的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)