web-dev-qa-db-fra.com

Comment se connecter à une base de données MySQL distante via SSL à l'aide de Play Framework?

Je déploie des applications Play dans des environnements distribués, reposant sur une base de données MySQL distante. Plus précisément, les applications sont hébergées sur heroku et la base de données sur Amazon RDS (bien que cela s'applique réellement à toute connexion à une base de données distante). Etant donné que la base de données ne se limite pas à localhost, je préférerais que la connexion à distance MySQL soit établie via SSL pour des raisons de sécurité. 

Étant donné qu’un certificat d’autorité de certification doit être approuvé, comment puis-je configurer une application Play pour se connecter au serveur MySQL via SSL, uniquement si le certificat d’hôte peut être vérifié? 

Supposons que ceci soit la configuration actuelle de la base de données:

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

En supposant que vous ayez déjà configuré le certificat de l'autorité de certification pour le serveur MySQL (ce qui est le cas lorsque vous utilisez Amazon RDS), quelques étapes sont nécessaires pour que cela fonctionne.

Tout d'abord, le certificat de l'autorité de certification doit être importé dans un fichier Java KeyStore à l'aide de keytool , fourni avec le JDK. Dans ce cas, le magasin de clés contiendra tous les certificats d’autorité de certification auxquels nous voulons faire confiance. Pour Amazon RDS, le certificat CA peut être trouvé ici . Avec mysql-ssl-ca-cert.pem dans votre répertoire de travail, vous pouvez exécuter la commande suivante:

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

Ce qui créera un nouveau fichier Java KeyStore appelé truststore.jks après vous avoir invité à entrer un mot de passe KeyStore et à vous demander si vous souhaitez faire confiance au certificat (oui, c'est le cas). Si vous avez déjà un fichier de magasin de clés de confiance, vous pouvez exécuter la même commande en remplaçant truststore.jks par le chemin d'accès à votre magasin de clés existant (vous serez alors invité à saisir le mot de passe du magasin de clés existant). Je place généralement truststore.jks dans mon répertoire conf.

Deuxièmement, dans application.conf, vous devez ajouter quelques paramètres d'URL JDBC à l'URL de la base de données:

verifyServerCertificate=true - Refuse de se connecter si le certificat d'hôte ne peut pas être vérifié.

useSSL=true - Connectez-vous à l'aide de SSL.

requireSSL=true - Refuse de se connecter si le serveur MySQL ne supporte pas SSL.

Par exemple, si votre URL de base de données actuelle est:

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

Alors il devrait maintenant être:

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

Enfin, quelques options de ligne de commande doivent être passées lors du démarrage du serveur Play pour configurer le magasin de clés de confiance utilisé par MySQL-Connector/J. En supposant que mon fichier truststore.jks se trouve dans le répertoire conf et que le mot de passe est password, je voudrais démarrer mon serveur (en mode dev) comme ceci:

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

En plus de cela, j'aime également m'assurer qu'il est impossible de se connecter à la base de données sans utiliser SSL, juste au cas où les options seraient gâchées au niveau de l'application. Par exemple, si db.default.user=root, exécutez les requêtes suivantes lorsque vous êtes connecté en tant que root sur le serveur MySQL:

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

Jut de mettre à jour sur tous.

  1. Vous pouvez télécharger le certificat de paquet contenant de nombreux certificats d'Amazon à partir d'ici https://s3.amazonaws.com/rds-downloads/rds-combined-ca-bundle.pem .
  2. Si vous voyez le contenu de ce pem, il contient de nombreux certificats. Divisez-le en plusieurs fichiers PEM où chaque fichier contiendra comme ceci

    -----BEGIN CERTIFICATE-----
        [main content]
    -----END CERTIFICATE-----
    
  3. Puis exécutez cette commande pour chaque fichier de cert que vous avez créé

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

Juste pour vous simplifier la vie, quelqu'un vient de créer le script bash pour cela: https://Gist.github.com/shareefhiasat/dabe5e96dbd7123c7b101aac1c0eca8a

0
privatejava