使用Java APisvalidationX509证书

我正在尝试针对java密钥库validation证书,这是我使用的代码如下所示。 如果它成功完成,那么我假设validation已经正确完成,否则如果抛出exception,则validation失败。 我担心的是:

下面的代码是否足以validation证书? 因为我在这里缺少一些东西(比如检查计算机签署的数据给我发送证书?)? 2.是否应核实证书中包含的签名? 如果有,怎么样?

在此先感谢您的回复! 普拉迪普

// To check the validity of the dates cert.checkValidity(); //Check the chain CertificateFactory cf = CertificateFactory.getInstance("X.509"); List mylist = new ArrayList(); mylist.add(cert); CertPath cp = cf.generateCertPath(mylist); PKIXParameters params = new PKIXParameters(getTrustStore()); params.setRevocationEnabled(false); CertPathValidator cpv = CertPathValidator.getInstance(CertPathValidator.getDefaultType()); PKIXCertPathValidatorResult pkixCertPathValidatorResult = (PKIXCertPathValidatorResult) cpv.validate(cp, params); 

通常,证书将由中间颁发机构颁发,而不是“根”权限(应该在您的信任存储中)。 大多数协议都鼓励发送证书的“链”,而不仅仅是实体的证书。

您应该添加所有中间证书,以便形成完整的链。

为了确保证书仍然有效,您不应禁用吊销检查。 如果您不想检索CRL(可能很大),发行者可能会提供OCSP支持。 但是,必须通过设置某些系统属性在Java运行时中启用此function。

如果路径validation器成功返回,则无需检查其他任何内容。 如果证书无效,则会引发exception。

此外,无需明确检查有效日期。 这在validation期间发生(使用当前时间,除非您通过PKIXParameters指定时间)。


有关validation的更广泛讨论,包括示例代码, 请参阅我之前的答案。

如果您对默认信任设置感到满意(因为它们将用于默认SSLContext ),您可以独立于SSL / TLS构建X509TrustManager ,并使用if独立validation您的证书。

它看起来像这样:

 TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); trustManagerFactory.init((KeyStore)null); // you could use a non-default KeyStore as your truststore too, instead of null. for (TrustManager trustManager: trustManagerFactory.getTrustManagers()) { if (trustManager instanceof X509TrustManager) { X509TrustManager x509TrustManager = (X509TrustManager)trustManager; x509TrustManager.checkServerTrusted(...); } } 

(您还应该检查服务器的标识和证书匹配,请参阅RFC 6125(在传输层安全(TLS)环境中使用X.509(PKIX)证书的Internet公钥基础结构中基于域的应用程序服务标识的表示和validation) 。)

您在此处所做的是validation证书(在您的示例cert )是否已由信任库中的任何可信CA签署( 直接 )。
此外,您检查是否到期,但不执行撤销检查。
因此,如果cert尚未由任何受信任的CA签署,您将获得例外。
因此,代码足以validationcert是否已由任何受信任的CA签名


如果您要引用服务器身份validation,那么post中的代码是不够的。
此代码仅validation特定证书是否由受信任的CA签名。
您没有迹象表明发送此证书的“实体”实际上是证书的所有者(即他们拥有与此证书相关联的私钥)。
这是SSL身份validation的一部分,例如客户端发送使用远程服务器的公钥加密的ClientKeyExchange消息,并确定如果另一方是假的,那么将无法解密消息