trustManager.checkServerTrusted(...)从不抛出CertificateException

时间:2014-06-13 05:05:58

标签: java ssl

我正在使用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 ...

评估异常消息是非常糟糕的风格,绝对不可靠。因此我的问题是:还有其他办法吗?

0 个答案:

没有答案