使用 Java 客户端库连接到 Spanner Omni

Spanner 的 Java 客户端库与 Spanner Omni 的运作方式与 Spanner 相同。本文档介绍了如何通过配置 Java 客户端库来建立与 Spanner Omni 的安全连接。您可以在创建数据库管理客户端或数据库客户端时设置客户端选项,以建立这些连接。

Java 客户端库支持纯文本、TLS、带凭据的 TLS 和 mTLS 连接。

如需了解详情,请参阅 Spanner 文档中的 Java 版 Spanner 使用入门

准备工作

如需开始在 Java 中使用 Spanner Omni,请使用 Java 客户端库 6.119.0 版或更高版本。

如果您使用的是不含物料清单 (BOM) 的 Maven,请将以下代码添加到 pom.xml 文件依赖项中:

<dependency>
  <groupId>com.google.cloud</groupId>
  <artifactId>google-cloud-spanner</artifactId>
  <version>6.119.0</version>
</dependency>

安全配置

Spanner Java 客户端库支持四种安全配置,这些配置定义了客户端与 Spanner Omni 之间通信的加密和身份验证方式。下表介绍了每种配置:

安全配置 说明
纯文本 通信未加密。
TLS 通信使用传输层安全 (TLS) 协议进行加密。此 配置要求您将 Spanner Omni CA 证书添加到 Java 信任库,如 配置 Java 信任库中所述。
带凭据的 TLS 通信使用 TLS 进行加密,身份验证使用用户名和密码执行 。
mTLS 通信使用双向 TLS (mTLS) 进行加密。此配置 要求您同时提供客户端证书和客户端私钥。

配置 Java 信任库

对于所有加密连接类型(TLS、带凭据的 TLS 和 mTLS),您都必须将 Spanner Omni CA 证书添加到 Java 信任库,以便客户端可以验证服务器的证书。

如需将 CA 证书添加到默认 Java 信任库,请运行以下命令:

sudo keytool -import -trustcacerts -file ~/.spanner/certs/ca.crt -alias spanner-ca -keystore $JAVA_HOME/lib/security/cacerts

或者,您可以在运行应用时指定自定义信任库:

  1. 如需与其他使用标准证书授权机构 (CA) 的服务保持兼容性,请复制默认 Java 信任库:

    cp $JAVA_HOME/lib/security/cacerts /PATH_TO_CUSTOM_CACERTS
    
  2. 将 CA 证书导入自定义信任库:

    keytool -import -trustcacerts -file ~/.spanner/certs/ca.crt -alias spanner-ca -keystore /PATH_TO_CUSTOM_CACERTS
    
  3. 在运行应用时,使用 JVM 系统属性指定自定义信任库:

    java -Djavax.net.ssl.trustStore=/PATH_TO_CUSTOM_CACERTS -Djavax.net.ssl.trustStorePassword=changeit app
    

配置 SpannerOptions 对象

在配置 SpannerOptions 对象以创建 DatabaseClientDatabaseAdminClient时, 请使用 setHost() 后跟 setType(SpannerOptions.InstanceType.OMNI) 指定 Spanner Omni 端点。

以下示例展示了如何为每个受支持的安全配置配置 SpannerOptions 对象:

纯文本

如需建立纯文本连接,请使用 http:// 指定 Spanner Omni 端点,并使用 usePlainText() 方法:

SpannerOptions options =
    SpannerOptions.newBuilder()
        .setHost("http://ENDPOINT") // Replace with your Spanner Omni endpoint
        .setType(SpannerOptions.InstanceType.OMNI)
        .usePlainText()
        .build();
Spanner spanner = options.getService();

TLS

为 TLS 连接配置 SpannerOptions 对象时,您无需指定用户名和密码凭据。使用 https:// 指定 Spanner Omni 端点:

SpannerOptions options =
    SpannerOptions.newBuilder()
        .setHost("https://ENDPOINT") // Replace with your Spanner Omni endpoint
        .setType(SpannerOptions.InstanceType.OMNI)
        .build();
Spanner spanner = options.getService();

带凭据的 TLS

如需建立使用用户名和密码进行身份验证的 TLS 连接,请使用 https:// 指定 Spanner Omni 端点,并使用 login() 方法指定用户名和密码:

SpannerOptions options =
    SpannerOptions.newBuilder()
        .setHost("https://ENDPOINT") // Replace with your Spanner Omni endpoint
        .setType(SpannerOptions.InstanceType.OMNI)
        .login("USERNAME", "PASSWORD".toCharArray())
        .build();
Spanner spanner = options.getService();

mTLS

如需使用 mTLS 连接,请使用以下命令将 Spanner Omni 生成的密钥转换为符合 Java 的格式:

openssl pkcs8 -topk8 -in ~/.spanner/certs/client.key -out ~/.spanner/certs/java-client.key -nocrypt

以下示例展示了如何配置 SpannerOptions 对象以使用客户端证书:

SpannerOptions options =
    SpannerOptions.newBuilder()
        .setHost("https://ENDPOINT") // Replace with your Spanner Omni endpoint
        .setType(SpannerOptions.InstanceType.OMNI)
        .useClientCert(
            "PATH_TO_CLIENT_CERT",
            "PATH_TO_CLIENT_CERT_KEY")
        .build();
Spanner spanner = options.getService();

获取数据库客户端

配置 SpannerOptions 对象后,您可以获取数据库客户端。 由于 Spanner Omni 不使用 Google Cloud 项目或实例 ID,因此在创建 DatabaseId 时,请为项目 ID 和实例 ID 指定 default

DatabaseId dbId = DatabaseId.of("default", "default", "DATABASE_ID");
DatabaseClient client = spanner.getDatabaseClient(dbId);