当前位置: 首页 > 知识库问答 >
问题:

Java X509证书解析与验证

松钟展
2023-03-14
public List<X509Certificate> parse(FileInputStream fis) {  
    /*
     * Generate a X509 Certificate initialized with the data read from the inputstream. 
     * NOTE: Generation fails when using BufferedInputStream on PKCS7 certificates.
     */
    List<X509Certificate> certificates = null;
      log.debug("Parsing new certificate.");
      certificates = (List<X509Certificate>) cf.generateCertificates(fis);
    return certificates;
  }

下一步是验证这些证书链。1)检查所有证书是否有有效日期(简单)2)使用OCSP验证证书链(如果在证书中没有发现OCSP URL,则返回CRL)。

我使用的是Sun JCE,但似乎没有那么多可用的文档(示例)?

我首先做了一个简单的实现,它只检查链,而不经过OCSP/CRL检查。

private Boolean validateChain(List<X509Certificate> certificates) {
    PKIXParameters params;
    CertPath certPath;
    CertPathValidator certPathValidator;
    Boolean valid = Boolean.FALSE;

    params = new PKIXParameters(keyStore);
    params.setRevocationEnabled(false);

    certPath = cf.generateCertPath(certificates);
    certPathValidator = CertPathValidator.getInstance("PKIX");

    PKIXCertPathValidatorResult result = (PKIXCertPathValidatorResult)  
    certPathValidator.validate(certPath, params);

      if(null != result) {
        valid = Boolean.TRUE;
      }
    return valid;
 }

但是在OCSP.url属性中手动设置OCSP url之后,我得到了一个java.security.cert.certPathValidatoreXception:OCSP响应错误:未授权

似乎我错过了许多必要的步骤,而许多在线参考资料说,设置OCSP.Enable属性应该是您所需要做的一切?

也许你们中有谁不能指导我完成这个过程?告诉我哪里我完全错了:)

    // Activate OCSP
        Security.setProperty("ocsp.enable", "true");
        // Activate CRLDP -- no idea what this is
        Security.setProperty("com.sun.security.enableCRLDP", "true");

        X509Certificate target = (X509Certificate) certPath.getCertificates().get(0);
        Security.setProperty("ocsp.responderURL","http://ocsp.pki.belgium.be/");
        Security.setProperty("ocsp.responderCertIssuerName", target.getIssuerX500Principal().getName());
        Security.setProperty("ocsp.responderCertSubjectName", target.getSubjectX500Principal().getName());
        Security.setProperty("ocsp.responderCertSerialNumber", target.getSerialNumber().toString(16));

共有1个答案

濮赤岩
2023-03-14

为了将来的参考,我将张贴我自己问题的答案(至少部分地)

OCSP和CRL检查已经在标准Java实现中实现,不需要定制代码或其他提供程序(BC,..)。它们在默认情况下是禁用的。

要启用此功能,至少必须设置两个参数:

(PKIXParameters or PKIXParameterBuilder) params.setRevocationEnabled(true);
Security.setProperty("ocsp.enable", "true");
System.setProperty("com.sun.security.enableCRLDP", "true");
X509CertSelector targetConstraints = new X509CertSelector();

targetConstraints.setCertificate(certificates.get(0));
// Here's the issue for PKCS7 certificates since they are not ordered,
// but I havent figured out how I can see what the target certificate
// (lowest level) is in the incoming certificates..

PKIXBuilderParameters params = new PKIXBuilderParameters(anchors, targetConstraints);   
 类似资料:
  • 问题内容: 我试图分几个步骤处理X509证书,并遇到了两个问题。我是JCE的新手,所以我还没有完全了解最新信息。 我们希望能够基于不同的编码(PEM,DER和PCKS7)解析几个不同的X509证书。我已经使用FireFox 从https://belgium.be以PEM和PCKS7格式导出了相同的证书(证书包括链)。我已经省略了几行不需要的问题 只要我使用FileInputStream而不是PCK

  • 问题内容: 任何推荐的Java加密库。我需要的是解析X.509证书以提取其中包含的信息的能力。 谢谢 问题答案: 在Java中,为java.security.cert.CertificateFactory。 “用于X.509的证书工厂必须返回作为java.security.cert.X509Certificate实例的证书”

  • 问题内容: 在Windows Vista SP2 + Python 2.7.10上,我可以连接到https://www.python.org,但不能连接到https://codereview.appspot.com 剧本: 并输出: 如何解决问题,https://codereview.appspot.com/到底有什么问题? 问题答案: 我的猜测是,它与OpenSSL中的替代链处理有关,如Pyth

  • 问题内容: 我正在尝试通过调用HTTPS REST API 。在开发过程中,我偶然发现以下错误: 因此,我在Google上搜索了一下,并找到了很多可行的解决方案。 使用Jersey客户端的HTTPS https://gist.github.com/outbounder/1069465 如何解决“ java.security.cert.CertificateException:不存在使用者替代名称”

  • 问题内容: 假设我编写了两个Java应用程序:并且它们被部署并在两个单独的服务器上运行(部署到和部署到),并且这两个应用程序需要通过SSL相互通信(双向)。我们还假设每个应用程序都有自己的SSL证书。 我(Java程序员)如何编码并验证彼此的SSL证书?每个CA是否都提供某种我可以使用的RESTful API ?Java是否有自己的证书验证API?我可以使用开放源代码的第三方JAR或服务吗? 当我

  • 我正在尝试通过调用HTTPS REST API。在开发过程中,我偶然发现了以下错误: 所以我用谷歌搜索了一下,找到了大量的解决方案,实际上是有效的。 使用泽西客户端的HTTPS https://gist.github.com/outbounder/1069465 如何修复java.security.cert.证书异常:不存在主题替代名称错误? http://www.mkyong.com/webse