使用Java APis验证X509证书

use*_*870 17 java

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

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

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

// To check the validity of the dates
cert.checkValidity();
//Check the chain
CertificateFactory cf = CertificateFactory.getInstance("X.509");
List<X509Certificate> mylist = new ArrayList<X509Certificate>();          
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);
Run Code Online (Sandbox Code Playgroud)

eri*_*son 7

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

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

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

如果路径验证器成功返回,则无需检查其他任何内容.如果证书无效,则会引发异常.

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


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

  • 我们需要设置哪些 java 运行时属性来启用证书的吊销检查。??? (2认同)

Cra*_*lus 1

您在这里所做的是验证证书(在您的示例中)是否已由信任库中的任何受信任的 CA (直接cert)签名。 此外,您还检查过期情况,但不执行吊销检查。 因此,如果尚未由任何受信任的 CA 签名,您将得到例外。 因此该代码足以验证是否已由任何受信任的 CA 签名

cert
cert


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