Usa la biblioteca cliente de Java para conectarte a Spanner Omni

La biblioteca cliente de Java para Spanner funciona con Spanner Omni de la misma manera que con Spanner. En este documento, se muestra cómo establecer conexiones seguras a Spanner Omni mediante la configuración de la biblioteca cliente de Java. Para establecer estas conexiones, debes configurar las opciones del cliente cuando creas un cliente administrativo de base de datos o un cliente de base de datos.

La biblioteca cliente de Java admite texto sin formato, TLS, TLS con credenciales y conexiones mTLS.

Para obtener más información, consulta Comienza a usar Spanner en Java en la documentación de Spanner.

Antes de comenzar

Para comenzar a usar Spanner Omni en Java, usa la biblioteca cliente de Java versión 6.119.0 o posterior.

Si usas Maven sin la lista de materiales (BOM), agrega lo siguiente a las dependencias del archivo pom.xml:

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

Parámetros de configuración de seguridad

La biblioteca cliente de Java de Spanner admite cuatro parámetros de configuración de seguridad, que definen cómo se encripta y autentica la comunicación entre el cliente y Spanner Omni. En la siguiente tabla, se describe cada configuración:

Configuración de seguridad Descripción
Texto sin formato La comunicación no está encriptada.
TLS La comunicación se encripta con la seguridad de la capa de transporte (TLS). Esta configuración requiere que agregues el certificado de la AC de Spanner Omni al almacén de certificados de confianza de Java, como se describe en Configura el almacén de certificados de confianza de Java.
TLS con credenciales La comunicación se encripta con TLS y la autenticación se realiza con un nombre de usuario y una contraseña.
mTLS La comunicación se encripta con TLS mutua (mTLS). Esta configuración requiere que proporciones un certificado de cliente y una clave privada de cliente.

Configura el almacén de confianza de Java

Para todos los tipos de conexión encriptada (TLS, TLS con credenciales y mTLS), debes agregar el certificado de la AC de Spanner Omni al almacén de certificados de confianza de Java para que el cliente pueda verificar el certificado del servidor.

Para agregar el certificado de CA al almacén de confianza predeterminado de Java, ejecuta el siguiente comando:

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

Como alternativa, puedes especificar un almacén de confianza personalizado cuando ejecutas la aplicación:

  1. Para mantener la compatibilidad con otros servicios que usan autoridades certificadoras (AC) estándar, copia el almacén de certificados de confianza predeterminado de Java:

    cp $JAVA_HOME/lib/security/cacerts /PATH_TO_CUSTOM_CACERTS
    
  2. Importa el certificado de CA a tu almacén de confianza personalizado:

    keytool -import -trustcacerts -file ~/.spanner/certs/ca.crt -alias spanner-ca -keystore /PATH_TO_CUSTOM_CACERTS
    
  3. Especifica el almacén de confianza personalizado con las propiedades del sistema de la JVM cuando ejecutes la aplicación:

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

Configura el objeto SpannerOptions

Cuando configures el SpannerOptions objeto para crear un DatabaseClient o DatabaseAdminClient, especifica el extremo de Spanner Omni con setHost() seguido de setType(SpannerOptions.InstanceType.OMNI).

En los siguientes ejemplos, se muestra cómo configurar el objeto SpannerOptions para cada configuración de seguridad admitida:

Texto sin formato

Para establecer una conexión de texto sin formato, especifica el extremo de Spanner Omni con http:// y usa el método 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

Cuando configuras el objeto SpannerOptions para una conexión TLS, no necesitas especificar credenciales de nombre de usuario y contraseña. Especifica el extremo de Spanner Omni con https://:

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

TLS con credenciales

Para establecer una conexión TLS con autenticación de nombre de usuario y contraseña, especifica el extremo de Spanner Omni con https:// y el nombre de usuario y la contraseña con el método 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

Para usar una conexión mTLS, convierte la clave generada por Spanner Omni a un formato compatible con Java con el siguiente comando:

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

En el siguiente ejemplo, se muestra cómo configurar el objeto SpannerOptions para usar un certificado de cliente:

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();

Obtén un cliente de base de datos

Después de configurar el objeto SpannerOptions, puedes obtener un cliente de base de datos. Como Spanner Omni no usa IDs de instancia ni de proyecto de Google Cloud, especifica default para el ID del proyecto y el ID de instancia cuando crees un DatabaseId:

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