我正在使用X509TrustManager的自定义TrustManager实现,我遇到了以下问题:
根据Javadocs,X509TrustManager应该抛出CertificateException:
void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException;
CertificateException是一个有很多子类的类:
java.security.cert.CertificateException
CertificateEncodingException
CertificateExpiredException
CertificateNotYetValidException
CertificateParsingException
CertificateRevokedException
不幸的是,永远不会抛出这些异常(至少不是从工厂返回的sun.security.ssl.X509TrustManagerImpl)。相反,我得到了一个带有不同原因的sun.security.validator.ValidatoreException:
sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path...
当CA不在信任库中或证书是自签名时
java.security.cert.CertPathValidatorException: Certificate has been revoked...
证书被撤销时
所以,我的问题是:找到证书验证问题的真正原因的最佳方法是什么,特别是考虑到我们不应该使用sun包这一事实?
干杯, 安德烈亚斯
@rxg
这正是我的问题 - 我抓住了CertificateException。但是,实际类型始终是ValidatorException,而不是记录的异常之一(CertificateEncodingException,CertificateExpiredException,CertificateNotYetValidException,CertificateParsingException,CertificateRevokedException)。要弄清楚验证异常的真正原因是什么,我必须分析导致异常的类并阅读消息,如下所示:
} catch (CertificateException e) {
if (e.getCause() instanceof java.security.cert.CertPathValidatorException ) {
if (e.getCause().getMessage().startsWith("Certificate has been revoked")) {
// ...
} else if (e.getCause().getMessage().startsWith("timestamp check failed")) {
// ...
}
} ... more ifs following ...
评估异常消息是非常糟糕的风格,绝对不可靠。因此我的问题是:还有其他办法吗?