Native Image 中的证书管理

Native Image 提供了多种方式来指定用于定义默认信任库(TrustStore)的证书文件。在以下章节中,我们将介绍可用的构建时和运行时选项。注意:native-image 的默认行为是从构建时主机环境中捕获并使用默认的信任库。

构建时选项 #

在镜像构建过程中,native-image 构建器会捕获主机环境的默认信任库,并将其嵌入到原生可执行文件中。默认情况下,此信任库是从 JDK 中提供的根证书文件创建的,但可以通过设置构建时系统属性 javax.net.ssl.trustStore 来更改为使用不同的证书文件(有关如何操作,请参阅属性)。

由于构建时证书文件的内容已嵌入到原生可执行文件中,因此目标环境中不需要存在该文件本身。

运行时选项 #

证书文件也可以在运行时通过设置 javax.net.ssl.trustStore\* 系统属性来动态更改。

如果在镜像执行期间设置了以下任何系统属性,native-image 还要求设置 javax.net.ssl.trustStore,并且该属性指向一个可访问的证书文件

  • javax.net.ssl.trustStore
  • javax.net.ssl.trustStoreType
  • javax.net.ssl.trustStoreProvider
  • javax.net.ssl.trustStorePassword

如果设置了这些属性中的任何一个,并且 javax.net.ssl.trustStore 没有指向可访问的文件,则会抛出 UnsupportedFeatureError 错误。

请注意,此行为与 OpenJDK 不同。当 javax.net.ssl.trustStore 系统属性未设置或无效时,OpenJDK 将回退到使用 JDK 中附带的证书文件。然而,此类文件不会与镜像可执行文件一起存在,因此不能用作回退。

在执行期间,还可以动态更改 javax.net.ssl.trustStore\* 属性,并相应地更新默认信任库。

最后,当上述所有 javax.net.ssl.trustStore\* 系统属性都被取消设置时,默认信任库将是构建时捕获的那个,如前一节所述。

不受信任的证书 #

在镜像构建过程中,一个不受信任的证书列表会从文件 <java.home>/lib/security/blacklisted.certs 中加载。该文件用于在构建时和运行时验证证书。换句话说,当在运行时通过设置 javax.net.ssl.trustStore\* 系统属性指定一个新的证书文件时,新证书仍将根据镜像构建时加载的 <java.home>/lib/security/blacklisted.certs 进行检查。

延伸阅读 #

联系我们