it-swarm.com.de

Wie kann ich mit Play Framework eine Verbindung zu einer entfernten MySQL-Datenbank über SSL herstellen?

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 befindet sich auf Amazon RDS (obwohl dies wirklich für jede entfernte Datenbankverbindung gilt). Da sich die Datenbank nicht nur auf localhost befindet, würde ich aus Sicherheitsgründen die entfernte MySQL-Verbindung über SSL herstellen. 

Wie kann ich eine Play-Anwendung für das Herstellen einer Verbindung mit dem MySQL-Server über SSL konfigurieren, wenn ein Zertifizierungsstellenzertifikat als vertrauenswürdig eingestuft wird, wenn das Hostzertifikat überprüft werden kann? 

Nehmen Sie dies als aktuelle Datenbankkonfiguration an:

db.default.driver=com.mysql.jdbc.Driver
db.default.url="jdbc:mysql://url.to.database/test_db"
db.default.user=root 
db.default.password="...."
19
Michael Zajac

Vorausgesetzt, Sie haben bereits das CA-Zertifikat für den MySQL-Server eingerichtet (dies ist der Fall, wenn Sie Amazon RDS verwenden), gibt es einige Schritte, um dies zu erreichen.

Zunächst sollte das CA-Zertifikat mit keytool in eine Java KeyStore-Datei importiert werden, die im JDK enthalten ist. 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

Dabei wird eine neue Java KeyStore-Datei mit dem Namen truststore.jks erstellt, nachdem Sie zur Eingabe eines KeyStore-Kennworts aufgefordert werden und gefragt werden, ob Sie dem Zertifikat vertrauen möchten (ja, Sie tun es). Wenn Sie bereits über eine Truststore-Datei verfügen, können Sie denselben Befehl ausführen und truststore.jks durch den Pfad zu Ihrem vorhandenen KeyStore ersetzen (Sie werden stattdessen zur Eingabe des Kennworts für den vorhandenen KeyStore aufgefordert). Ich lege truststore.jks normalerweise in meinem conf-Verzeichnis ab.

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

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

useSSL=true - Verbinden Sie sich mit SSL.

requireSSL=true - Keine Verbindung herstellen, 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 sein:

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

Schließlich müssen beim Starten des Play-Servers einige Befehlszeilenoptionen übergeben werden, um den Truststore zu konfigurieren, den MySQL-Connector/J verwenden wird. Wenn sich meine truststore.jks-Datei im Verzeichnis conf befindet und das Kennwort password lautet, würde ich meinen Server (im Dev-Modus) folgendermaßen starten:

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

Darüber hinaus möchte ich auch sicherstellen, dass es ohne SSL nicht möglich ist, eine Verbindung zur Datenbank herzustellen, nur für den Fall, dass die Optionen auf der Anwendungsebene irgendwie durcheinander geraten. Wenn beispielsweise db.default.user=root beim MySQL-Server als root angemeldet ist, führen Sie die folgenden Abfragen aus:

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

Jut auf All zu aktualisieren.

  1. Sie können das Bundle-Zertifikat, das viele Amazon-Zertifikate enthält, hier herunterladen https://s3.amazonaws.com/rds-downloads/rds-combined-ca-bundle.pem .
  2. Wenn Sie den Inhalt dieses Pem sehen, enthält es viele Zertifikate. Teilen Sie es in mehrere PEM-Dateien auf, in denen jede Datei so enthalten wird

    -----BEGIN CERTIFICATE-----
        [main content]
    -----END CERTIFICATE-----
    
  3. Führen Sie dann diesen Befehl für jede von Ihnen erstellte cert-Datei aus

    keytool -import \
    -keystore  $Java_HOME/jre/lib/security/cacerts \
    -storepass changeit -noprompt \
    -alias $ALIAS -file $YOUR_INDIVIDUAL_PEM_FILE
    

Nur um Ihnen das Leben zu erleichtern, hat jemand gerade ein bash-Skript dafür erstellt: https://Gist.github.com/shareefhiasat/dabe5e96dbd7123c7b101aac1c0eca8a

0
privatejava