使用Java APis验证X509证书

问题描述

| 我正在尝试根据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);
    

解决方法

通常,证书将由中间颁发机构而不是“根”颁发机构(这应该在您的信任库中)颁发。大多数协议都鼓励发送证书的“链”,而不仅仅是实体的证书。 您应该添加所有中间证书,以便可以形成完整的链。 为了确定证书仍然有效,您不应禁用吊销检查。如果您不想检索CRL(可能很大),则发行者可以提供OCSP支持。但是,必须通过设置某些系统属性在Java运行时中启用它。 如果路径验证程序成功返回,则无需检查其他任何内容。如果证书无效,将引发异常。 同样,无需对有效日期进行明确检查。这会在验证期间发生(使用当前时间,除非您通过
PKIXParameters
指定时间)。 有关验证的更广泛讨论,包括示例代码,请参阅我的先前答案。     ,如果您对默认的信任设置感到满意(因为默认信任设置将用于默认的
SSLContext
),则可以独立于SSL / TLS构建
X509TrustManager
,并使用if来独立验证证书。 它看起来像这样:
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(在传输层安全性上下文中使用X.509(PKIX)证书在Internet公钥基础结构中表示和验证基于域的应用程序服务身份) (TLS))。     ,您在此处所做的工作是验证信任存储区中的任何受信任CA是否已(直接)对证书(在示例中为“ 5”)进行了签名。 此外,您检查是否到期,但不执行吊销检查。 因此,如果任何受信任的CA都未对“ 5”进行签名,您将获得一个例外。 因此,该代码足以验证任何受信任的CA是否已签署了“ 5” 如果您指的是服务器身份验证,则帖子中的代码不足。 此代码仅验证特定证书是否由受信任的CA签名。 但是,您没有任何迹象表明发送此证书的\“实体\”实际上是证书的所有者(即,他们拥有与此证书关联的私钥)。 这是SSL身份验证的一部分,例如客户端发送用远程服务器的公钥加密的“ 8”消息,并确定如果对方是假的,则无法解密该消息