原生镜像中的证书管理
原生镜像提供多种方式来指定用于定义默认信任库的证书文件。在以下部分中,我们将描述可用的构建时和运行时选项。注意: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
进行检查。