微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决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 举报,一经查实,本站将立刻删除。