第 4 章 Red Hat build of OpenJDK 功能
最新的 Red Hat build of OpenJDK 17 发行版本可能包括新功能。另外,最新版本可能会增强、弃用或删除来自以前红帽构建的 OpenJDK 17 版本的功能。
有关所有其他更改和安全修复,请参阅 OpenJDK 17.0.12 发行版本。
Red Hat build of OpenJDK 的改进
Red Hat build of OpenJDK 17 为最初在以前 OpenJDK 版本中创建的功能提供改进。
仅 POSTOCSP 请求的回退选项
JDK-8175903 是红帽构建的 OpenJDK 17 中引入的,增加了对将 HTTP GET 方法用于在线证书状态协议(OCSP)请求的支持。此功能为小请求无条件地启用。
Internet Engineering Task Force (IETF) RFC 5019 和 RFC 6960 明确允许,并建议使用 HTTP GET 请求。但是,有些 OCSP 响应器无法在这些类型的请求中正常工作。
Red Hat build of OpenJDK 17.0.12 引入了 JDK 系统属性 com.sun.security.ocsp.useget。默认情况下,此属性设置为 true,它会保留对小请求使用 GET 请求的当前行为。如果此属性设置为 false,则只使用 HTTP POST 请求,无论大小如何。
只有 POST-only OCSP 请求的这个回退选项是一个非标准功能,如果使用带有 OCSP 响应器的 HTTP GET 请求,则在以后的发行版本中可能会删除它。
请参阅 JDK-8328638 (JDK Bug System)。
DTLS 1.0 默认禁用
OpenJDK 9 引入了对 Datagram Transport Layer Security (DTLS)协议(JEP-219)版本 1.2 的支持。不再建议使用基于 TLS 1.1 的 DTLSv1.0,因为此协议被视为弱且现代标准不安全。在 OpenJDK 17.0.12 中,如果您尝试使用 DTLSv1.0,则 JDK 会默认抛出一个 SSLHandshakeException。
如果要继续使用 DTLSv1.0,可以通过修改 java.security. properties 系统属性或从 jdk.tls.disabledAlgorithms 系统属性中删除 DTLSv1.0。
不建议使用 DTLSv1.0,处于用户自己的风险下。
请参阅 JDK-8256660 (JDK Bug System)。
RPATH 优先于 RUNPATH 用于内部 JDK 二进制文件中的 $ORIGIN 运行时搜索路径
JDK 中的原生可执行文件和库使用嵌入式运行时搜索路径(rpaths)来定位所需的内部 JDK 原生库。在 Linux 系统上,二进制文件可以使用 DT_RPATH 或 DT_RUNPATH 指定这些搜索路径。
-
如果二进制文件使用
DT_RPATH指定搜索路径,则会在LD_LIBRARY_PATH环境变量中指定的任何路径 之前 搜索这些路径。 -
如果二进制文件使用
DT_RUNPATH指定搜索路径,则仅在LD_LIBRARY_PATH中指定的路径 后 进行搜索。这意味着,使用DT_RUNPATH可让 JDK 内部库被LD_LIBRARY_PATH中指定的名称的任何库覆盖,这在安全视角中不可取。
在以前的版本中,使用的运行时搜索路径类型是基于动态链接器的默认搜索路径。在 OpenJDK 17.0.12 中,为确保使用 DT_RPATH,--disable-new-dtags 选项被明确传递给链接器。
请参阅 JDK-8326891 (JDK Bug System)。
TrimNativeHeapInterval 选项作为产品交换机提供
红帽构建的 OpenJDK 17.0.12 提供了 -XX:TrimNativeHeapInterval=ms 选项作为官方产品切换。此功能增强使 JVM 可以在支持的平台上指定间隔(以毫秒为单位)修剪原生堆。目前,这个增强唯一支持的平台是使用 glibc 的 Linux。
您可以通过设置 TrimNativeHeapInterval=0 来禁用修剪。修剪功能默认为禁用。
请参阅 JDK-8325496 (JDK Bug System)。
-XshowSettings launcher 选项包含一个 安全 类别
在 OpenJDK 17.0.12 中,-XshowSettings launcher 选项包含一个安全类别,允许传递以下参数:
| 参数 | 详情 |
|---|---|
|
or
| 显示所有安全设置并继续。 |
|
| 显示安全属性并继续。 |
|
| 显示静态安全提供程序设置并继续。 |
|
| 显示与 TLS 相关的安全设置并继续。 |
如果应用程序类路径或模块路径中包含第三方安全供应商,且在 java.security 文件中配置,则输出会包括这些第三方安全提供程序。
请参阅 JDK-8281658 (JDK Bug System)。
添加了 GlobalSign R46 和 E46 root 证书
在 OpenJDK 17.0.12 中,cacerts truststore 包括两个 GlobalSign TLS root 证书:
- 证书 1
- Name: GlobalSign
- 别名名称:globalsignr46
- distinguished name: CN=GlobalSign Root R46, O=GlobalSign nv-sa, C=BE
- 证书 2
- Name: GlobalSign
- 别名名称:globalsigne46
- distinguished name: CN=GlobalSign Root E46, O=GlobalSign nv-sa, C=BE
请参阅 JDK-8316138 (JDK Bug System)。
修复了在代码 根扫描 阶段因为不平衡迭代而暂停长时间垃圾回收的修复
垃圾回收的代码 根扫描 阶段查找对编译的代码中的 Java 对象的引用。为加快这个过程,会在包含 Java 堆引用的编译代码的每个区域中维护缓存。
假设一组引用非常小,以前的发行版本使用每个区域的单一线程来迭代这些引用。这种单线程方法引入了一个可扩展性瓶颈,如果特定区域包含大量参考,则性能可能会降低。
在 Red Hat build of OpenJDK 17.0.12 中,会使用多个线程,这有助于删除任何可伸缩瓶颈。
请参阅 JDK-8315503 (JDK Bug System)。
在 Windows 上更改 AWT 无头模式检测的行为
在早期版本中,除非 java.awt.headless 系统属性被设置为 true,否则在 Windows Server 平台上调用 java.awt.GraphicsEnvironment.isHeadless () 返回 false。
从 OpenJDK 17.0.12 开始,除非 java.awt.headless 属性明确设置为 false,且当前系统上没有检测到有效的 monitor,则调用 java.awt.GraphicsEnvironment.isHeadless () 会在 Windows Server 平台上返回 true。可能无法检测到有效的 monitor,例如,如果会话是由服务启动还是 PowerShell 远程启动。
这个行为的变化意味着在这些条件下运行的应用程序(以前预期会在头环境中运行),现在可能会遇到 Abstract Window Toolkit (AWT)操作所引发的非 头例外 错误。
您可以通过将 java.awt.headless 属性设置为 false 来重新恢复旧行为。但是,如果应用程序以 headful 模式运行,且有效的显示不可用,则这些应用程序可能会继续遇到意外问题。