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 lo hace con Spanner. En este documento, se muestra cómo establecer conexiones seguras con Spanner Omni configurando la biblioteca cliente de Java. Para establecer estas conexiones, debes configurar las opciones del cliente cuando creas un cliente administrativo de la base de datos o un cliente de la base de datos.

La biblioteca cliente de Java admite conexiones de texto sin formato, TLS, TLS con credenciales y 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 versión 6.119.0 o posterior de la biblioteca cliente de Java.

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 configuraciones 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 CA de Omni de Spanner al almacén de confianza de Java, como se describe en Configura el almacén 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 del 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 la AC al almacén de certificados 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 ejecutes 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 objeto SpannerOptions para crear un objeto 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 es necesario que especifiques 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 que generó 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 proyectos ni de instancias de Google Cloud, especifica default para el ID del proyecto y el ID de la instancia cuando crees un DatabaseId:

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