Utiliser la bibliothèque cliente Java pour se connecter à Spanner Omni

La bibliothèque cliente Java pour Spanner fonctionne avec Spanner Omni de la même manière qu'avec Spanner. Ce document explique comment établir des connexions sécurisées à Spanner Omni en configurant la bibliothèque cliente Java. Pour établir ces connexions, vous devez définir des options client lorsque vous créez un client d'administration de base de données ou un client de base de données.

La bibliothèque cliente Java est compatible avec les connexions en texte brut, TLS, TLS avec identifiants et mTLS.

Pour en savoir plus, consultez la section Premiers pas avec Spanner en Java dans la documentation Spanner.

Avant de commencer

Pour commencer à utiliser Spanner Omni en Java, utilisez la bibliothèque cliente Java version 6.119.0 ou ultérieure.

Si vous utilisez Maven sans la nomenclature (BOM), ajoutez les éléments suivants aux dépendances du fichier pom.xml :

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

Configurations de sécurité

La bibliothèque cliente Java Spanner est compatible avec quatre configurations de sécurité, qui définissent le mode de chiffrement et d'authentification des communications entre le client et Spanner Omni. Le tableau suivant décrit chaque configuration :

Configuration de la sécurité Description
Texte brut La communication n'est pas chiffrée.
TLS La communication est chiffrée à l'aide du protocole TLS (Transport Layer Security). Cette configuration nécessite que vous ajoutiez le certificat CA Spanner Omni au keystore Java, comme décrit dans Configurer le keystore Java.
TLS avec identifiants La communication est chiffrée à l'aide du protocole TLS, et l'authentification est effectuée à l'aide d'un nom d'utilisateur et d'un mot de passe.
mTLS La communication est chiffrée à l'aide du protocole mTLS (mutual TLS). Cette configuration nécessite que vous fournissiez à la fois un certificat client et une clé privée client.

Configurer le keystore Java

Pour tous les types de connexion chiffrée (TLS, TLS avec identifiants et mTLS), vous devez ajouter le certificat CA Spanner Omni au keystore Java afin que le client puisse vérifier le certificat du serveur.

Pour ajouter le certificat CA au keystore Java par défaut, exécutez la commande suivante :

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

Vous pouvez également spécifier un keystore personnalisé lorsque vous exécutez l'application :

  1. Pour assurer la compatibilité avec d'autres services qui utilisent des autorités de certification (CA) standards, copiez le keystore Java par défaut :

    cp $JAVA_HOME/lib/security/cacerts /PATH_TO_CUSTOM_CACERTS
    
  2. Importez le certificat CA dans votre keystore personnalisé :

    keytool -import -trustcacerts -file ~/.spanner/certs/ca.crt -alias spanner-ca -keystore /PATH_TO_CUSTOM_CACERTS
    
  3. Spécifiez le keystore personnalisé à l'aide des propriétés système de la JVM lorsque vous exécutez l'application :

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

Configurer l'objet SpannerOptions

Lorsque vous configurez l' SpannerOptions pour créer un DatabaseClient ou un DatabaseAdminClient, spécifiez le point de terminaison Spanner Omni à l'aide de setHost() suivi de setType(SpannerOptions.InstanceType.OMNI).

Les exemples suivants montrent comment configurer l'objet SpannerOptions pour chaque configuration de sécurité compatible :

Texte brut

Pour établir une connexion en texte brut, spécifiez le point de terminaison Spanner Omni avec http:// et utilisez la méthode 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

Lorsque vous configurez l'objet SpannerOptions pour une connexion TLS, vous n'avez pas besoin de spécifier d'identifiants (nom d'utilisateur et mot de passe). Spécifiez le point de terminaison Spanner Omni à l'aide de https:// :

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

TLS avec identifiants

Pour établir une connexion TLS avec authentification par nom d'utilisateur et mot de passe, spécifiez le point de terminaison Spanner Omni à l'aide de https:// et le nom d'utilisateur et le mot de passe à l'aide de la méthode 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

Pour utiliser une connexion mTLS, convertissez la clé générée par Spanner Omni dans un format compatible avec Java à l'aide de la commande suivante :

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

L'exemple suivant montre comment configurer l'objet SpannerOptions pour utiliser un certificat client :

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

Obtenir un client de base de données

Une fois que vous avez configuré l'objet SpannerOptions, vous pouvez obtenir un client de base de données. Étant donné que Spanner Omni n'utilise pas d'ID de projet ni d'ID d'instance Google Cloud, spécifiez default pour l'ID de projet et l'ID d'instance lorsque vous créez un DatabaseId :

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