Ceci est l'article du 8ème jour du Speee Advent Calendar 2018! Veuillez vous abonner si vous le souhaitez.
Hier, je suis allé à [AWS re: Invent 2018] par @selmertsx! ](Https://tech.speee.jp/entry/2018/12/07/163341).
Aujourd'hui ** se connecte à plusieurs instances MySQL compatibles SSL dans JDBC **. Après avoir lu cet article, vous n'aurez peut-être pas à vous soucier de vous connecter à plusieurs instances MySQL avec SSL dans JDBC.
Auparavant, j'avais migré deux serveurs MySQL, maître et réplica, vers Cloud SQL de GCP, comme illustré dans la figure ci-dessous. À ce moment-là, lorsque j'ai activé SSL, ce que je n'avais pas pu faire auparavant, il était facile de basculer dans Ruby (Rails), mais je ne pouvais pas le faire immédiatement en Java.
Cet article est un mémo de la solution à ce moment-là.
Puisque c'est un gros problème, comment se connecter avec Rails.
Pour Rails, ajoutez simplement les paramètres SSL à database.yaml
.
Il semble bon d'émettre un certificat avec Cloud SQL et de le placer au bon endroit.
Je l'ai mis sous la forme suivante (extrait).
database.yaml
default: &default
adapter: mysql2
...
ssl: &ssl
sslca: <%= ENV.fetch("HOGE_DATABASE_SSL_SERVER_CA") %>
sslcert: <%= ENV.fetch("HOGE_DATABASE_SSL_CLIENT_CERT") %>
sslkey: <%= ENV.fetch("HOGE_DATABASE_SSL_CLIENT_KEY") %>
development:
<<: *default
database: hoge_development
...
test:
<<: *default
database: hoge_test
...
staging:
<<: *default
<<: *ssl
database: hoge_staging
...
production:
<<: *default
<<: *ssl
database: hoge_production
...
L'application Rails qui a changé la destination de connexion dans ce travail de commutation a créé un modèle de base pour chaque DB dans lequel le database.yaml à lire a été modifié afin de se connecter à plusieurs DB, donc ajoutez-le à chaque database.yaml. J'ai pu le faire SSL.
C'est facile.
Pour Java, c'est un peu plus compliqué que Rails. En principe, il est supposé qu'il existe un paramètre JDBC pour chaque destination de connexion.
Dans le cas de Java, il n'est pas possible d'utiliser les trois pems car ils sont comme des Rails. Il doit être importé dans un conteneur au format Java Key Store (JKS). De plus, si vous souhaitez importer la clé privée, vous devez utiliser la commande ʻopenssh` pour la convertir au format PKCS12 avant de pouvoir l'importer dans JKS.
L'importation est la suivante. Créez ceci ** séparément pour chaque instance MySQL à laquelle vous souhaitez vous connecter.
$ keytool -import -file ./server-ca.pem -alias <Quelque chose de nom distinctif> -keystore <Nom de fichier du conteneur>
$ openssl pkcs12 -export -inkey ./client-key.pem -in ./client-cert.pem -name <Quelque chose de nom distinctif> -out ./temp.p12
$ keytool -importkeystore -srckeystore ./temp.p12 -srcstoretype pkcs12 -destkeystore <Nom de fichier du conteneur>
--Lors de la création d'un conteneur au format Java Key Store pour la première fois, un nouveau sera créé avec le nom de fichier spécifié.
―― keytool
est un outil fourni avec JDK etc., et il peut ne pas être possible de passer le chemin. Il semble être dans bin
sous le chemin d'installation de JDK.
Après avoir préparé JKS pour chaque base de données, ajoutez les paramètres à l'URL de connexion de JDBC. Spécifiez les six suivants.
JKS
.clientCertificateKeyStoreUrl
.JKS
.L'exemple suivant est l'URL de connexion pour se connecter à une instance MySQL pour une réplique avec IP: www.xxx.yyy.zzz
avec le pilote MySQL JDBC.
jdbc:mysql://www.xxx.yyy.zzz:3306/hoge?useSSL=true&requireSSL=true&clientCertificateKeyStoreUrl=file:///path/to/secrets/hoge_replica.jks&clientCertificateKeyStoreType=JKS&clientCertificateKeyStorePassword=<Définir le mot de passe&trustCertificateKeyStoreUrl=file:///path/to/secrets/hoge_replica.jks&trustCertificateKeyStoreType=JKS&trustCertificateKeyStorePassword=<Définir le mot de passe>"
Si vous souhaitez l'utiliser en tant que maître, remplacez simplement le chemin du fichier JKS et le mot de passe par celui du maître. Vous pouvez maintenant vous connecter à plusieurs instances MySQL compatibles SSL.
Une façon de se connecter à une instance MySQL avec SSL activé dans Java était de la spécifier comme option lors de l'exécution de Java. Au départ, j'ai essayé de combiner les certificats et les clés maître et réplique en un seul JKS, mais pour une raison quelconque, le programme ne fonctionnait pas correctement et j'étais en difficulté.
Après avoir étudié diverses choses, il semble que ce soit un bogue Java? spécification? Donc, si l'émetteur (dans le cas de CloudSQL, c'est Google) met plusieurs certificats identiques dans un JKS, veuillez sélectionner de manière appropriée pour chaque destination de connexion DB ** pas ** est. Ainsi, par exemple, lorsque vous essayez de vous connecter à la réplique avec le certificat du maître, la connexion SSL est coupée.
Depuis que j'ai fait une instance MySQL de CloudSQL, je l'ai utilisée comme MySQL dans le texte, mais je pense que l'application sera efficace lors de l'établissement d'une connexion SSL en utilisant JDBC en Java.
Recommended Posts