客户端支持
Spring Vault 支持多种 HTTP 客户端来访问 Vault 的 HTTP API。Spring Vault 使用 RestTemplate 作为访问 Vault 的主要接口。专用的客户端支持源自于 自定义的 SSL 配置,该配置仅适用于 Spring Vault 的客户端组件。
Spring Vault 支持以下 HTTP 命令式客户端:
-
Java 内置的
HttpURLConnection
(如果没有其他可用的客户端,则作为默认客户端) -
Apache Http Components
-
OkHttp 3
Spring Vault 的响应式集成支持以下响应式 HTTP 客户端:
-
Java 内置的响应式
HttpClient
(如果没有其他可用客户端,则为默认客户端) -
Reactor Netty
-
Apache Http Components
-
Jetty
使用特定的客户端需要在类路径上提供相应的依赖项,以便 Spring Vault 可以使用可用的客户端与 Vault 进行通信。
Java 内置的 HttpURLConnection
Java 内置的 HttpURLConnection
无需额外配置即可直接使用。使用 HttpURLConnection
时,SSL 配置方面存在一定的限制。Spring Vault 不会应用自定义的 SSL 配置,因为这将需要对 JVM 进行深度重新配置。这种配置会影响所有依赖默认 SSL 上下文的组件。使用 HttpURLConnection
配置 SSL 设置时,需要将这些设置作为系统属性提供。更多详情请参见 自定义 JSSE。
外部客户端
你可以使用外部客户端来访问 Vault 的 API。只需将以下依赖项之一添加到你的项目中。如果使用 Spring Vault 的依赖 BOM,可以省略版本号。
示例 1. Apache Http Components 依赖
<dependency>
<groupId>org.apache.httpcomponents.client5</groupId>
<artifactId>httpclient5</artifactId>
</dependency>
Apache HttpClient 的 wire logging 可以通过日志配置启用。请确保不要意外启用 wire logging,因为日志可能会以明文形式暴露应用程序与 Vault 之间的流量(令牌和密钥)。
示例 2. Square OkHttp 3
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
</dependency>
示例 3. Reactor Netty
<dependency>
<groupId>io.projectreactor.netty</groupId>
<artifactId>reactor-netty</artifactId>
</dependency>
示例 4. Apache Http Components 响应式依赖
<dependency>
<groupId>org.apache.httpcomponents.core5</groupId>
<artifactId>httpcore5-reactive</artifactId>
</dependency>
示例 5. Jetty
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-reactive-httpclient</artifactId>
</dependency>
Vault 客户端 SSL 配置
SSL 可以通过设置各种属性使用 SslConfiguration 进行配置。你可以设置 javax.net.ssl.trustStore
来配置 JVM 范围内的 SSL 设置,或者配置 SslConfiguration
来仅为 Spring Vault 设置 SSL 配置。
SslConfiguration sslConfiguration = SslConfiguration.create( 1
new FileSystemResource("client-cert.jks"), "changeit".toCharArray(),
new FileSystemResource("truststore.jks"), "changeit".toCharArray());
SslConfiguration.forTrustStore(new FileSystemResource("keystore.jks"), 2
"changeit".toCharArray())
SslConfiguration.forKeyStore(new FileSystemResource("keystore.jks"), 3
"changeit".toCharArray())
SslConfiguration.forKeyStore(new FileSystemResource("keystore.jks"), 4
"changeit".toCharArray(),
KeyConfiguration.of("key-password".toCharArray(),
"my-key-alias"))
完整配置。
仅配置信任库设置。
仅配置密钥库设置。
仅配置密钥库设置并提供密钥配置。
请注意,提供 SslConfiguration 只能在你的类路径中包含 Apache Http Components 或 OkHttp 客户端时应用。
SSL 配置还支持 PEM 编码的证书,作为 Java Key Store 的替代方案。
KeyStoreConfiguration keystore = KeyStoreConfiguration
.of(new ClassPathResource("ca.pem")).withStoreType("PEM");
SslConfiguration configuration = SslConfiguration.forTrustStore(keystore);
PEM 文件可能包含一个或多个证书(以 -----BEGIN CERTIFICATE-----
和 -----END CERTIFICATE-----
为标志的块)。添加到基础 KeyStore
的证书会使用完整的主题名称作为别名。