[JAVA] Stellen Sie mit aktiviertem SSL in JDBC eine Verbindung zu mehreren MySQL-Instanzen her

Dieser Beitrag

Dies ist der Artikel zum 8. Tag von Speee Advent Calendar 2018! Bitte abonnieren Sie, wenn Sie möchten.

Gestern bin ich von @selmertsx zu [AWS re: Invent 2018] gegangen! ](Https://tech.speee.jp/entry/2018/12/07/163341).

Heute wird ** eine Verbindung zu mehreren SSL-fähigen MySQL-Instanzen in JDBC hergestellt **. Nach dem Lesen dieses Artikels müssen Sie sich möglicherweise nicht mehr um die Verbindung zu mehreren MySQL-Instanzen mit SSL in JDBC kümmern.

Einführung

Zuvor habe ich zwei MySQL-Server, Master und Replikat, auf Cloud SQL von GCP migriert (siehe Abbildung unten). Database移行 Zu dieser Zeit, als ich SSL aktivierte, was ich vorher nicht konnte, war es einfach, in Ruby (Rails) zu wechseln, aber ich konnte es nicht sofort in Java tun.

Dieser Artikel ist ein Memo der damaligen Lösung.

Plötzlich beiseite

Da es eine große Sache ist, wie man sich mit Rails verbindet. Fügen Sie für Rails einfach die Einstellungen für SSL zu "database.yaml" hinzu. Es scheint gut, ein Zertifikat mit Cloud SQL auszustellen und an der richtigen Stelle zu platzieren. Ich habe es in der folgenden Form eingestellt (Auszug).

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
    ...

Die Rails-Anwendung, die das Verbindungsziel in dieser Vermittlungsarbeit gewechselt hat, hat ein Basismodell für jede Datenbank erstellt, in der die zu lesende database.yaml geändert wurde, um eine Verbindung zu mehreren DBs herzustellen. Fügen Sie sie daher zu jeder database.yaml hinzu. Ich konnte es SSL machen.

Es ist einfach.

Hauptthema

Für Java ist es etwas komplizierter als Rails. Als Voraussetzung wird angenommen, dass für jedes Verbindungsziel eine JDBC-Einstellung vorhanden ist.

Vorbereitung

Im Fall von Java ist es nicht möglich, die drei Pems zu verwenden, da sie wie Rails sind. Es muss in einen JKS-Container (Java Key Store Format) importiert werden. Wenn Sie den privaten Schlüssel importieren möchten, müssen Sie ihn mit dem Befehl openssh in das PKCS12-Format konvertieren, bevor Sie ihn in JKS importieren können.

Der Import ist wie folgt. Erstellen Sie diese ** separat für jede MySQL-Instanz, zu der Sie eine Verbindung herstellen möchten.

$ keytool -import -file ./server-ca.pem -alias <Etwas Besonderes> -keystore <Dateiname des Containers>
$ openssl pkcs12 -export -inkey ./client-key.pem -in ./client-cert.pem -name <Etwas Besonderes> -out ./temp.p12
$ keytool -importkeystore -srckeystore ./temp.p12 -srcstoretype pkcs12 -destkeystore <Dateiname des Containers>

Verbindungseinstellungen

Fügen Sie nach der Vorbereitung von JKS für jede Datenbank die Einstellungen zur Verbindungs-URL von JDBC hinzu. Geben Sie die folgenden sechs an.

Das folgende Beispiel ist die Verbindungs-URL für die Verbindung zu einer MySQL-Instanz für das Replikat mit IP: "www.xxx.yyy.zzz" mit dem MySQL-JDBC-Treiber.

jdbc:mysql://www.xxx.yyy.zzz:3306/hoge?useSSL=true&amp;requireSSL=true&amp;clientCertificateKeyStoreUrl=file:///path/to/secrets/hoge_replica.jks&amp;clientCertificateKeyStoreType=JKS&amp;clientCertificateKeyStorePassword=<Passwort festlegen&amp;trustCertificateKeyStoreUrl=file:///path/to/secrets/hoge_replica.jks&amp;trustCertificateKeyStoreType=JKS&amp;trustCertificateKeyStorePassword=<Passwort festlegen>"

Wenn Sie es als Master verwenden möchten, ändern Sie einfach den JKS-Dateipfad und das Kennwort auf den für den Master. Sie können jetzt eine Verbindung zu mehreren SSL-fähigen MySQL-Instanzen herstellen.

Beiseite

Eine Möglichkeit, eine Verbindung zu einer MySQL-Instanz mit aktiviertem SSL in Java herzustellen, bestand darin, diese als Option anzugeben, wenn Java ausgeführt wird. Anfangs habe ich versucht, die Master- und Replikatzertifikate und -schlüssel in einem JKS zu kombinieren, aber aus irgendeinem Grund funktionierte das Programm nicht richtig und ich hatte Probleme.

Nach der Untersuchung verschiedener Dinge scheint es, dass es sich um einen Java-Fehler handelt? Spezifikation? Wenn der Aussteller (im Fall von CloudSQL ist es Google) mehrere gleiche Zertifikate in einem JKS ablegt, wählen Sie bitte für jedes DB-Verbindungsziel entsprechend ** nicht ** aus ist. Wenn Sie beispielsweise versuchen, mit dem Master-Zertifikat eine Verbindung zum Replikat herzustellen, wird die SSL-Verbindung unterbrochen.

abschließend

Da ich tatsächlich eine MySQL-Instanz von CloudSQL erstellt habe, habe ich sie im Text als MySQL verwendet, aber ich denke, dass die Anwendung beim Herstellen einer SSL-Verbindung mit JDBC in Java effektiv sein wird.

Recommended Posts

Stellen Sie mit aktiviertem SSL in JDBC eine Verbindung zu mehreren MySQL-Instanzen her
Stellen Sie mit Java eine Verbindung zu MySQL 8 her
Gibt an, ob SSL bei Verwendung von JDBC mit MySQL aktiviert werden soll.
[Java] Stellen Sie eine Verbindung zu MySQL her
Einstellungen für die Verbindung zu MySQL mit Spring Boot + Spring JDBC
So verbinden Sie MySQL / MariaDB + HikariCP mit Liferay 7 / DXP
Stellen Sie mit Java eine Verbindung zur Datenbank her
Verbinde dich mit Eclipse mit Orakel!
[Android] Verbindung zu MySQL herstellen (unvollendet)
Ich habe versucht, mithilfe von JDBC Template mit Spring MVC eine Verbindung zu MySQL herzustellen
Vorgang zum Verbinden mehrerer Streams @Java
JDBC-Verbindung mit MySQL 8.x * Hinweise *
mysql2 kann mit der Bundle-Installation nicht installiert werden
Stellen Sie mit dem iPhone eine Verbindung zum Rails-Server her
Aktualisieren Sie MySQL mit Docker von 5.7 auf 8.0
Ich möchte im Dialogfeld mehrere Elemente mit einem benutzerdefinierten Layout auswählen
[Java] Ich habe JDBC installiert und versucht, eine Verbindung mit Servlet + MySQL herzustellen. (Es gibt eine Version mit DAO / Bean)
Notiz, um mehrere Werte in HashMap zu haben
Mit Docker auf Heroku bereitstellen (Rails 6, MySQL)
Bearbeiten Sie MySQL mit Befehlen in der Docker-Umgebung
Verwendung von MySQL im Rails-Tutorial
Stellen Sie mit Eclipse eine Verbindung von Java zu MySQL her
So leiten Sie zu http-> https um, wenn SSL in der Rails × Heroku-Umgebung aktiviert ist
Lösung, die beim Versuch, mit Java eine Verbindung zu DB (MySQL) herzustellen, einen Fehler verursacht
[Schienen] So registrieren Sie mehrere Datensätze in der Zwischentabelle mit einer Zuordnung von vielen zu vielen
[Java] Ich habe versucht, über den Verbindungspool eine Verbindung mit Servlet (Tomcat) & MySQL & Java herzustellen