Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Wie verbinde ich mich mit Play Framework über SSL mit einer Remote-MySQL-Datenbank?

Angenommen, Sie haben bereits das CA-Zertifikat für den MySQL-Server eingerichtet (was bei der Verwendung von Amazon RDS der Fall ist), gibt es ein paar Schritte, damit dies funktioniert.

Zuerst sollte das CA-Zertifikat mit keytool , die mit dem JDK geliefert wird. Der KeyStore enthält in diesem Fall alle CA-Zertifikate, denen wir vertrauen möchten. Für Amazon RDS finden Sie das CA-Zertifikat hier . Mit mysql-ssl-ca-cert.pem in Ihrem Arbeitsverzeichnis können Sie den folgenden Befehl ausführen:

keytool -import -alias mysqlServerCACert -file mysql-ssl-ca-cert.pem -keystore truststore.jks

Dadurch wird eine neue Java KeyStore-Datei mit dem Namen truststore.jks erstellt nachdem Sie aufgefordert wurden, ein KeyStore-Kennwort einzugeben, und gefragt wurden, ob Sie dem Zertifikat vertrauen möchten (ja, das tun Sie). Wenn Sie bereits über eine Truststore-Datei verfügen, können Sie denselben Befehl ausführen und dabei truststore.jks ersetzen mit dem Pfad zu Ihrem vorhandenen KeyStore (Sie werden dann stattdessen nach dem Kennwort des vorhandenen KeyStore gefragt). Normalerweise platziere ich truststore.jks in meiner conf Verzeichnis.

Zweitens in application.conf Sie müssen der Datenbank-URL einige JDBC-URL-Parameter hinzufügen:

verifyServerCertificate=true - Verbindung verweigern, wenn das Hostzertifikat nicht verifiziert werden kann.

useSSL=true - Verbindung über SSL.

requireSSL=true - Verbindung verweigern, wenn der MySQL-Server SSL nicht unterstützt.

Wenn Ihre aktuelle Datenbank-URL beispielsweise lautet:

db.default.url="jdbc:mysql://url.to.database/test_db"

Dann sollte es jetzt heißen:

db.default.url="jdbc:mysql://url.to.database/test_db?verifyServerCertificate=true&useSSL=true&requireSSL=true"

Schließlich gibt es noch ein paar Befehlszeilenoptionen, die beim Starten des Play-Servers übergeben werden müssen, um den Truststore zu konfigurieren, den MySQL-Connector/J verwenden wird. Angenommen meine truststore.jks Datei befindet sich in der conf Verzeichnis und das Passwort ist password , würde ich meinen Server (im Dev-Modus) wie folgt starten:

activator run -Djavax.net.ssl.trustStore="conf/truststore.jks" -Djavax.net.ssl.trustStorePassword="password"

Darüber hinaus stelle ich gerne sicher, dass es unmöglich ist, sich ohne SSL mit der Datenbank zu verbinden, nur für den Fall, dass die Optionen auf Anwendungsebene irgendwie durcheinander geraten. Zum Beispiel, wenn db.default.user=root , dann bei Anmeldung als root Führen Sie auf dem MySQL-Server die folgenden Abfragen aus:

GRANT USAGE ON *.* TO 'root'@'%' REQUIRE SSL;
FLUSH PRIVILEGES;