En supposant que vous ayez déjà configuré le certificat CA pour le serveur MySQL (ce qui est le cas lors de l'utilisation d'Amazon RDS), il y a quelques étapes pour que cela fonctionne.
Tout d'abord, le certificat CA doit être importé dans un fichier Java KeyStore à l'aide de outil clé
, fourni avec le JDK. Le KeyStore dans ce cas contiendra tous les certificats CA 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 demandé si vous souhaitez faire confiance au certificat (oui, vous le faites). Si vous avez déjà un fichier truststore, vous pouvez exécuter la même commande en remplaçant truststore.jks
avec le chemin d'accès à votre KeyStore existant (vous serez alors invité à entrer le mot de passe du KeyStore existant à la place). Je place habituellement truststore.jks
dans ma conf
répertoire.
Deuxièmement, dans application.conf
vous devez ajouter quelques paramètres d'URL JDBC à l'URL de la base :
verifyServerCertificate=true
- Refuser de se connecter si le certificat de l'hôte ne peut pas être vérifié.
useSSL=true
- Connectez-vous en utilisant SSL.
requireSSL=true
- Refuser de se connecter si le serveur MySQL ne supporte pas SSL.
Par exemple, si l'URL de votre base de données actuelle est :
db.default.url="jdbc:mysql://url.to.database/test_db"
Alors ça devrait maintenant être :
db.default.url="jdbc:mysql://url.to.database/test_db?verifyServerCertificate=true&useSSL=true&requireSSL=true"
Enfin, il y a quelques options de ligne de commande qui doivent être transmises lors du démarrage du serveur Play pour configurer le truststore que MySQL-Connector/J utilisera. En supposant que mon truststore.jks
le fichier est situé dans le conf
répertoire et le mot de passe est password
, je démarrerais 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 aussi 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
, puis une fois connecté en tant que root
dans le serveur MySQL, exécutez les requêtes suivantes :
GRANT USAGE ON *.* TO 'root'@'%' REQUIRE SSL;
FLUSH PRIVILEGES;