Java 客户端 OCSP 抛出“无法确定吊销状态”

问题描述

我尝试在相互 TLS 连接的客户端启用 OCSP 检查。如果我仅在服务器端启用,则服务器将正确验证客户端证书。

当我使用以下参数在客户端启用时:

-Djavax.net.ssl.trustStore="$ROOTDIR/certs/intermediate/certs/local-truststore.jks" -Djavax.net.ssl.trustStorePassword=<some-password> -Djava.security.debug="certpath ocsp" -Djavax.net.debug="all" -Dcom.sun.net.ssl.checkRevocation=true -Docsp.enable=true

然后客户端抛出错误:

java.security.cert.CertPathValidatorException: Could not determine revocation status

查看 ocsp certpath 调试跟踪并通过各种不同的场景,似乎 OCSP 验证器以某种方式将 CA 证书视为“坏”(请参阅​​下面的 certpath:RejectKeySelector.match:bad key 行)。

certpath: ForwardBuilder.getMatchingCerts()...
certpath: ForwardBuilder.getMatchingEECerts()...
certpath: X509CertSelector.match(SN: 1000
  Issuer: CN=root-ca.acme.com,O="Acme Corp,LLC",ST=New York,C=US
  Subject: CN=intermediate-ca.acme.com,C=US)
certpath: X509CertSelector.match: subject DNs don't match
certpath: X509CertSelector.match(SN: 1003
  Issuer: CN=intermediate-ca.acme.com,C=US
  Subject: CN=ledger.acme.com,C=US)
certpath: X509CertSelector.match: subject DNs don't match
certpath: ForwardBuilder.getMatchingCACerts()...
certpath: ForwardBuilder.getMatchingCACerts(): the target is a CA
certpath: X509CertSelector.match(SN: f9e9243278f85e6a21408510cbedf46d8f0333
  Issuer: CN=root-ca.acme.com,C=US
  Subject: CN=root-ca.acme.com,C=US)
certpath: X509CertSelector.match returning: true
**certpath: RejectKeySelector.match: bad key**
certpath: X509CertSelector.match(SN: 1000
  Issuer: CN=root-ca.acme.com,C=US)
certpath: X509CertSelector.match: subject DNs don't match
certpath: ForwardBuilder.getMatchingCACerts: found 0 CA certs
certpath: SunCertPathBuilder.depthFirstSearchForward(): certs.size=0
12:16:23.215 [main] ERROR app.ClientApp$ - io.grpc.StatusRuntimeException: UNAVAILABLE: io exception

这似乎是在以下 JDK 库代码中抛出的:

http://cr.openjdk.java.net/~vinnie/8019627/webrev.00/raw_files/new/src/share/classes/sun/security/provider/certpath/RevocationChecker.java

确切的证书根据在信任库中传递的 CA 进行更改,即在我的测试配置中的两层中,只有通过时才会在 root-ca 上失败,或者在两者都通过时在中间-ca 上失败。

在跟踪中我从 SunCertPathBuilder.engineBuild 中看到这一点

  Target Cert Constraints: RejectKeySelector: [
X509CertSelector: [
  Subject: CN=root-ca.acme.com,O=Acme Corp\,LLC,C=US
  matchAllSubjectAltNames flag: true
  Key Usage: KeyUsage [
  Crl_Sign
]

但不清楚为什么(在这种情况下是 root-ca)被添加到 RejectKeySelector。

从服务器(链或个人)和信任库(仅链或根)传递的预期有效的证书组合是什么?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...