- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的情况是,我的用户可以通过我的应用程序信任的第三方颁发的客户端证书来验证系统。颁发我的客户端证书的第 3 方提供了根证书和中间证书,我已将这些证书添加到服务器端的信任库中。现在,我需要验证我的客户端证书构建信任链并检查客户端证书的 OCSP 状态。因此,我从我的信任库加载了受信任的中间证书和根证书,并构建了证书路径,如下代码所示:
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 是我通过以下行从传入请求中获取的证书数组,并将其作为列表传递给 buildCertPath。
X509Certificate[] certArray = (X509Certificate[]) request.getAttribute("javax.servlet.request.X509Certificate");
我有点困惑。在此示例中,信任 anchor 似乎是根据通过请求而来的证书而不是从信任库加载的证书构建的。另外,在进行 OCSP 状态检查时,我计划从 keystore 获取颁发者证书并将其传递给以下方法
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;
}
但是我从 repo 示例中理解的内容具有误导性,我可能需要从请求而不是从我的信任库获取 IssuerCert(中间,根证书)。虽然我意识到,如果证书有效,则颁发的中间证书和根证书应该与我也加载到我的信任库的第三部分证书颁发机构提供的证书相同,但如果我的客户端证书链没问题怎么办,但事实上它不是我的服务器信任的 - 因此我认为我必须从我的 keystore 而不是从请求构建我的信任 anchor ,并且在 OCSP 状态检查颁发者证书的方法中应该从 keystore 加载而不是我从客户端收到的请求还是我错了?
现在我有三个问题:
1) 在 buildCertPath 方法中,是否应该从通过请求或从信任库加载的证书(证书本身/中间/根)构建信任库 anchor ?
2)在 buildCertPath 方法中是否应该从请求或信任库中获取中间证书?
3)最后,在 validateOCSPStatus 方法中,我应该从哪里获取颁发者证书?换句话说,颁发者证书应该是什么 - 信任库中的证书还是请求中的证书?
我真的迷失在很多例子中,如果有人帮助我澄清我的问题,我将非常感激
最佳答案
如果您使用 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')
关于证书,假设您有诸如根 -> 中间 CA -> 客户端
之类的东西,如果您信任中间 CA
,则客户端只需提供他们的 客户端
证书。如果您仅包含根
,他们将需要提供中间 CA
以及客户端
证书。
关于java - 应根据哪些证书构建信任 anchor ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57060977/
我是一名优秀的程序员,十分优秀!