2014-12-17 8 views
15

Ich stelle Play-Anwendungen in verteilten Umgebungen bereit, die von einer entfernten MySQL-Datenbank unterstützt werden. Insbesondere werden die Anwendungen auf heroku gehostet, und die Datenbank ist auf Amazon RDS (obwohl dies wirklich für jede entfernte Datenbankverbindung gilt). Da sich die Datenbank nicht nur auf localhost befindet, würde ich bevorzugen, dass die entfernte MySQL-Verbindung zur Sicherheit aus SSL besteht.Wie kann ich mit Play Framework eine Verbindung zu einer entfernten MySQL-Datenbank über SSL herstellen?

Mit einem CA-Zertifikat zu vertrauen, wie kann ich eine Play-Anwendung für die Verbindung mit dem MySQL-Server über SSL konfigurieren, nur wenn das Host-Zertifikat verifiziert werden kann?

Angenommen, dies als die aktuelle Datenbankkonfiguration:

db.default.driver=com.mysql.jdbc.Driver 
db.default.url="jdbc:mysql://url.to.database/test_db" 
db.default.user=root 
db.default.password="...." 
+1

Hinweis: Dies ist nicht spezifisch Framework zu spielen, eher eine allgemeinen Java/MySQL Sache –

Antwort

26

Sie bereits den CA-Zertifikat-Setup für den MySQL-Server Unter der Annahme, (was der Fall ist bei der Verwendung von Amazon RDS), gibt es ein paar Schritte, um dies zu machen Arbeit.

Zuerst sollte das CA-Zertifikat in eine Java KeyStore-Datei importiert werden, die keytool verwendet, 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 kann das CA-Zertifikat here gefunden werden. 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 

, die eine neue Java-Schlüsselspeicherdatei truststore.jks nach dem Sie aufgefordert genannt erstellen ein Kennwort für Schlüsselspeicher und fragen eingeben, wenn Sie das Zertifikat vertrauen wollen (ja , Sie machen). Wenn Sie bereits eine Truststore-Datei haben, können Sie denselben Befehl ausführen, indem Sie truststore.jks durch den Pfad zu Ihrem vorhandenen KeyStore ersetzen (Sie werden dann stattdessen zur Eingabe des Kennworts für den vorhandenen KeyStore aufgefordert). Normalerweise platziere ich truststore.jks in meinem Verzeichnis conf.

Zweitens in application.conf Sie benötigen einige JDBC-URL-Parameter an die Datenbank-URL hinzuzufügen:

verifyServerCertificate=true - eine Verbindung verweigern, wenn das Host-Zertifikat nicht überprüft werden kann.

useSSL=true - Verbindung über SSL herstellen.

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

Zum Beispiel, wenn Ihre aktuelle Datenbank-URL ist:

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

Dann sollte es nun sein:

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

Schließlich gibt es einige Kommandozeilenoptionen, die weitergegeben werden müssen, wenn Starten Sie den Play-Server, um den Truststore zu konfigurieren, den MySQL-Connector/J verwenden wird. Unter der Annahme, meine truststore.jks Datei wird im conf Verzeichnis befindet, und das Kennwort ist password, würde ich meine Server starten (in dev-Modus) wie folgt aus:

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

Zusätzlich dazu, Ich mag auch machen Sicher, dass es unmöglich ist, eine Verbindung zur Datenbank herzustellen, ohne SSL zu verwenden, nur für den Fall, dass die Optionen auf Anwendungsebene irgendwie durcheinander geraten.Zum Beispiel, wenn db.default.user=root, dann, wenn sie als root im MySQL-Server angemeldet, führen Sie die folgenden Abfragen:

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

Keine Notwendigkeit zu ' FLUSH PRIVILEGES 'nach' GRANT ... '. Sie müssen das nur tun, wenn Sie die Tabellen mysql. * Direkt geändert haben. –

+0

genau das, was ich suche, danke – KGCybeX

Verwandte Themen