【问题标题】:Java 9 and TLS OCSP staplingJava 9 和 TLS OCSP 装订
【发布时间】:2017-09-27 03:15:58
【问题描述】:

我已经安装了 Java 9,因为我想使用 OCSP(在线证书状态协议)功能和 TLS 握手,也就是 OCSP 装订。正如https://docs.oracle.com/javase/9/security/java-pki-programmers-guide.htm#JSSEC-unique_4307382 所说,Java 9 是第一个使用 OCSP 装订的版本。

要对其进行测试,您可以设置或读取某些新属性,例如“jdk.tls.server.enableStatusRequestExtension”。

但是,当使用

查询此属性时,我得到的是“null”而不是“false”(或“true”)
System.getProperty("jdk.tls.server.enableStatusRequestExtension")

刚刚用新的 jShell 试了一下:

[jshell> System.getProperty("jdk.tls.server.enableStatusRequestExtension")

$2 ==> null

Java 9 不应该发生这种情况。有什么想法吗?这是我两天前下载的所谓的早期访问版本。 Java 9 的正式发布日期为 2017 年 9 月 21 日(昨天)。不幸的是,Mac OSX 还没有发布版本。 难道这个功能还没有在 Early Access Build 中实现(应该接近最终版本)?

希望任何人都可以在这里提供帮助。

【问题讨论】:

  • 这是jdk.tls.server.enableStatusRequestExtension JVM 属性吗?
  • @nullpointer Oracle 页面 (docs.oracle.com/javase/9/security/…) 说:“设置 Java 服务器以使用 OCSP 装订在线证书状态协议 (OCSP) 装订通过设置系统属性 jdk 在服务器上启用。 tls.server.enableStatusRequestExtension 为 true。(默认设置为 false。)“所以它是一个系统属性。不确定这是否与 JVM 属性相同。
  • 但是 System.getProperty() 将返回 null 如果没有您指定的键的属性,这一直是正确的。您为什么声称“Java 9 不应该发生这种情况”?
  • 我不确定我为什么会被误解。我引用的那句话不是清楚地表明 Java 9 确实存在此属性吗?它是随 Java 9 引入的。它不是操作系统的属性,它是 JVM 的一个属性。所以我不明白为什么如果句子清楚地表明它默认设置为“false”,它为什么应该为空。
  • 我怀疑您在此特定上下文中误解了文档中“默认”的含义。它指的是没有属性设置时代码的默认行为,而不是属性设置的默认值。请参阅下面的帖子。

标签: tls1.2 handshake java-9 ocsp


【解决方案1】:

jshell 为您对 System.getProperty("jdk.tls.server.enableStatusRequestExtension") 的调用返回 null,因为该属性不存在。我在 Java 9 下得到了相同的结果。

您似乎希望该属性在 Java 9 下自动存在,但事实并非如此;您仍然需要显式创建它,并为其分配“true”值。来自JEP 249,在 Java 9 中实现了此功能:

实现将为 OCSP 特定参数选择合理的默认值,并将通过 以下系统属性...

这并不意味着所有 OCSP 属性都自动存在于 Java 9 中并具有默认设置;这意味着在没有这些 OCSP 系统属性的情况下,代码将“选择合理的默认值”。例如,如果服务器无法读取属性 jdk.tls.server.enableStatusRequestExtension 实现将(合理地)表现得好像该属性已设置为“false”值。

另请参阅Oracle presentation on security 中的 OCSP 代码示例:

// Enable OCSP Stapling (off by default)
System.setProperty(“jdk.tls.server.enableStatusRequestExtension”, “true”);
// Yes, that’s really it!

所以我建议您根据需要明确设置 OCSP 的客户端和服务器属性,不要担心它们在 Java 9 下不存在。

TLDR 版本:Java 9 支持 TLS 的 OCSP 装订,但假定在没有用户明确配置的情况下未启用它。

【讨论】:

  • 感谢您的回答。对我来说,文档很容易被误解,但现在我更好地理解了其中的含义。所以我使用 System.setProperty("jdk.tls.server.enableStatusRequestExtension", "true"); 在我的 TLS 服务器中设置属性。让我的 TLS 客户端和 TLS 服务器进行握手。我仍然没有在日志记录中看到那些 status_request[_v2] 扩展的任何痕迹(在 JVM 参数中设置了 -Djavax.net.debug=ssl)。我本来希望在 ClientHello 或 ServerHello 消息中看到一些提及,但什么也没有。
  • 只有在设置 System.setProperty("com.sun.net.ssl.checkRevocation", "true"); TLS 握手失败并显示“主要,处理异常:javax.net.ssl.SSLHandshakeException:sun.security.validator.ValidatorException:PKIX 路径验证失败:java.security.cert.CertPathValidatorException:无法确定吊销状态”但仍然没有提及在 ClientHello 或 ServerHello 中关于 status_request 或 status_request_v2 扩展的使用。对我来说还是有点奇怪。
  • @Marc 设置 enableStatusRequestExtens‌​ion 属性是必要的,但还不够。对于客户端驱动的 OCSP,您还需要将安全属性 ocsp.enable 设置为“true”。请参阅安全开发人员指南的第 8 章:docs.oracle.com/javase/9/security/…
  • @Marc 但是您现在的问题与原始 OP 不同,所以如果您仍有问题,请提出一个新问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-01
  • 1970-01-01
相关资源
最近更新 更多