客戶端支援

Spring Vault 支援各種 HTTP 客戶端來訪問 Vault 的 HTTP API。Spring Vault 使用 RestTemplate 作為訪問 Vault 的主要介面。專門的客戶端支援源於僅限於 Spring Vault 客戶端元件的定製 SSL 配置

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 的線日誌可以透過日誌配置啟用。請確保不要意外啟用線日誌,因為日誌可能會以明文形式暴露應用程式和 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"))
1 完整配置。
2 僅配置信任庫設定。
3 僅配置金鑰庫設定。
4 僅配置金鑰庫設定並提供金鑰配置。

請注意,提供 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 的證書使用完整的subject name作為別名。