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

应该从哪些证书构建信任锚?

饶志
2023-03-14

我的用户可以通过我的应用程序信任的第三方颁发的客户端证书对系统进行身份验证。颁发我的客户端证书的第三方提供了根证书和中间证书,我已将其添加到服务器端的信任库中。现在,我需要验证我的客户端证书,建立信任链,并检查客户端证书的OCSP状态。因此,我从trustore中加载了受信任的中间证书和根证书,并构建了证书路径,如下代码所示:

 private KeyStore loadKeyStore() throws KeyStoreException {
        KeyStore trustAnchor = KeyStore.getInstance(KeyStore.getDefaultType());
        try (InputStream in = new FileInputStream(trustStorePath)) {
            trustAnchor.load(in, trustStorePass.toCharArray());
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (CertificateException e) {
            e.printStackTrace();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }

        return trustAnchor;
    }

    private PKIXCertPathBuilderResult buildCertPath(List<X509Certificate> certChain) throws KeyStoreException, InvalidAlgorithmParameterException, NoSuchAlgorithmException, CertPathBuilderException {
        KeyStore trustAnchor = loadKeyStore();
        X509CertSelector certSelector = new X509CertSelector();
        certSelector.setCertificate(certChain.get(0));
        PKIXBuilderParameters params = new PKIXBuilderParameters(trustAnchor,certSelector);
        CertStoreParameters intermediateCerts = new CollectionCertStoreParameters(certChain);
        params.addCertStore(CertStore.getInstance("Collection", intermediateCerts));
          params.setRevocationEnabled(false);
        CertPathBuilder builder = CertPathBuilder.getInstance("PKIX");
        PKIXCertPathBuilderResult builderResult = (PKIXCertPathBuilderResult) builder.build(params);
        return builderResult;
    }

在这里certChain是我通过以下行从传入请求中获得的证书数组,并将其传递给build dCertPath as List。

X509Certificate[] certArray = (X509Certificate[]) request.getAttribute("javax.servlet.request.X509Certificate");

然后我在网上找到了这个回购https://github.com/nandosola/trantor-certificate-verifier/blob/master/src/main/java/cc/abstra/trantor/security/certificate/ocsp/OCSPVerifier.java

我有点困惑。在本例中,似乎信任锚是根据通过请求获得的证书而不是从信任库加载的证书构建的。此外,在执行OCSP状态检查时,我计划从密钥库获取我的颁发者证书,并将其传递给以下方法

public RevocationStatus validateOCSPStatus(X509Certificate cert, X509Certificate issuerCert) throws OCSPVerifierException, OCSPException, IOException {
        LOGGER.info("Starting to validate OCSP status: ");
        OCSPReq ocspReq = generateRequest(issuerCert, cert.getSerialNumber());
        if (ocspReq == null) throw new OCSPVerifierException(ExceptionEnum.OCSP_Request_Build_Error);
        RevocationStatus status = null;
        URL url = getOCSPURL(cert);
        if (url == null) throw new OCSPVerifierException(ExceptionEnum.OCSP_INVALID_URL_ERROR);
        SingleResp[] responses = null;
        OCSPResp ocspResp = getOCSPResponse(url, ocspReq);
        if (OCSPResponseStatus.SUCCESSFUL == ocspResp.getStatus()) {
            BasicOCSPResp basicResponse = (BasicOCSPResp) ocspResp.getResponseObject();
            responses = (basicResponse == null) ? null : basicResponse.getResponses();
        }

        if (responses != null && responses.length == 1) {
            SingleResp resp = responses[0];
            status = getRevocationStatus(resp);
        }

        return status;
    }

但我从回购示例中了解到的是,我有误导性,我可能需要从请求中获取issuerCert(中间,根证书),而不是从我的信任库中获取。虽然我意识到,如果证书有效,我的客户证书颁发的中间证书和根证书应该与我也加载到信任库的第三方证书颁发机构提供的证书相同,但如果我的客户证书链正常,但事实上,它并不是我的服务器信任的对象——因此我假设我必须从密钥库而不是从请求中构建我的信任锚,并且在OCSP状态检查方法中,应该从密钥库而不是从客户端获得的请求中加载颁发者证书,还是我错了?

现在我有三个问题:

1) 在buildCertPath方法中,信任库锚点应该从通过请求的证书(证书本身/中间/根)构建还是从信任库加载?

2)在build dCertPath方法中,中间证书应该从请求或信任存储中获得吗?

3)最后,在方法validateOCSP状态中,我应该从哪里获得发行者证书?换句话说,什么应该是发行者证书——信任存储中的证书还是请求中的证书?

我真的迷失在很多例子中有我真的很感激如果有人帮助我澄清我的问题

共有1个答案

盖嘉庆
2023-03-14

如果您使用的是Spring Boot,那么应该启用clientAuth,让JVM负责客户端身份验证和CRL/OCSP检查,而无需手动检查所有这些。由于客户端证书由第三方颁发,请确保它们是服务器JVM信任存储的一部分,方法是将它们添加到cacerts,或使用您自己的信任存储和如下配置

-Djavax.net.ssl.trustStore="trust-store.jks"
-Djavax.net.ssl.trustStorePassword="a-great-password"

我相信OCSP检查在默认情况下是禁用的,您可以通过以下方式启用:

System.setProperty('com.sun.net.ssl.checkRevocation', 'true')
Security.setProperty('ocsp.enable', 'true')

关于证书,假设你有Root-

 类似资料:
  • 问题内容: 我有一个Web应用程序,该应用程序调用通过SSL保护的SOAP Web服务。)。 服务器发送两个证书(Root和Leaf),因此我使用属性导入了两个证书:。 要在Websphere上启用ssl验证,我只需将证书添加到websphere中: SSL证书和密钥管理->密钥库和证书-> NodeDefaultTrustStore->签署者证书->从端口检索: 主机:主机名 端口:443 别名

  • 我遇到了Android4设备的一个问题,它在连接到服务器时收到以下异常: 但出于某种原因,我不明白它在Android4版本中开始失败了。 我尝试了信任所有证书的解决方案[LINK],它起作用了,但这显然存在安全问题,比如将您的应用程序暴露于“中间人”攻击 如何实现具有默认行为但仅将服务器的证书白名单的TrustManager。 在证书链给了我两个证书的格式: 用获得的url和证书替换了示例中的ur

  • 问题内容: 我试图使用(java)密钥工具创建一个自签名证书,但是当我尝试使用它时,出现以下异常(有关完整异常,请参见底部)。 我知道我可以使用以下代码绕过此代码: (资源) 但是我对此解决方案不感兴趣,因为我认为这会造成安全漏洞。(如果我错了,请纠正我)。 谁能指出我正确的方向?我目前正在本地进行测试,因此很容易进行更改。我可以访问服务器代码,客户端代码和.keystore文件。 更新资料 我试

  • 我正试图将我的计算机配置为信任用于测试网站的自签名证书。然而,我在Firefox上遇到了一些问题。Chrome和IE都没问题。 我做了以下几点。 使用OpenSSL创建2048位pem rsa密钥和crt 从密钥和crt文件创建pfx文件 使用MMC将pfx导入到服务器上的个人证书存储中 将IIS配置为使用站点的证书 在客户端PC上 null 我还尝试将证书直接添加到Firefox的权限列表中。它

  • 我有一个通过SSL从node.js提供服务的网站。当我使用web浏览器(桌面和Android)访问站点时。一切都很好--当我检查证书是有效的并且一切看起来都很好时,锁出现了,表明站点是安全的。这应该意味着服务器设置正确,对吧? 然而,当我尝试使用Android WebView对完全相同的站点时,页面无法加载--我甚至在日志中看不到对该网页的请求。安德烈,在放松logcat上的过滤器后,我注意到了这

  • 我在Weblogic服务器上有一个web应用程序,它通过HTTPS接受带有自签名证书的连接。Weblogic服务器URL上的Web应用https://server1.com:7122/webapp1/ 我还在同一台服务器上安装了ngnix,该服务器上的证书充当服务器上所有Web应用程序的前端。Nginx服务器URLhttps://server1.com:443/ 我希望用户通过nginx访问Web