Ervan uitgaande dat u de CA-certificaatconfiguratie voor de MySQL-server al hebt (wat het geval is bij het gebruik van Amazon RDS), zijn er een paar stappen om dit te laten werken.
Eerst moet het CA-certificaat worden geïmporteerd in een Java KeyStore-bestand met behulp van keytool
, die bij de JDK wordt geleverd. De KeyStore bevat in dit geval alle CA-certificaten die we willen vertrouwen. Voor Amazon RDS is het CA-certificaat hier
te vinden . Met mysql-ssl-ca-cert.pem
in uw werkmap kunt u het volgende commando uitvoeren:
keytool -import -alias mysqlServerCACert -file mysql-ssl-ca-cert.pem -keystore truststore.jks
Dat zal een nieuw Java KeyStore-bestand maken met de naam truststore.jks
nadat u wordt gevraagd om een KeyStore-wachtwoord in te voeren en te vragen of u het certificaat wilt vertrouwen (ja, dat doet u). Als u al een truststore-bestand heeft, kunt u dezelfde opdracht uitvoeren, waarbij u truststore.jks
vervangt met het pad naar uw bestaande KeyStore (u wordt dan gevraagd om het wachtwoord van de bestaande KeyStore). Ik plaats meestal truststore.jks
in mijn conf
directory.
Ten tweede, in application.conf
je moet een paar JDBC URL-parameters toevoegen aan de database-URL:
verifyServerCertificate=true
- Weiger verbinding te maken als het hostcertificaat niet kan worden geverifieerd.
useSSL=true
- Maak verbinding via SSL.
requireSSL=true
- Weiger verbinding te maken als de MySQL-server geen SSL ondersteunt.
Als uw huidige database-URL bijvoorbeeld is:
db.default.url="jdbc:mysql://url.to.database/test_db"
Dan zou het nu moeten zijn:
db.default.url="jdbc:mysql://url.to.database/test_db?verifyServerCertificate=true&useSSL=true&requireSSL=true"
Ten slotte zijn er enkele opdrachtregelopties die moeten worden doorgegeven bij het starten van de Play-server om de truststore te configureren die MySQL-Connector/J zal gebruiken. Uitgaande van mijn truststore.jks
bestand bevindt zich in de conf
directory, en het wachtwoord is password
, zou ik mijn server (in dev-modus) als volgt starten:
activator run -Djavax.net.ssl.trustStore="conf/truststore.jks" -Djavax.net.ssl.trustStorePassword="password"
Daarnaast wil ik er ook voor zorgen dat het onmogelijk is om verbinding te maken met de database zonder SSL te gebruiken, voor het geval de opties op de een of andere manier in de war raken op applicatieniveau. Bijvoorbeeld als db.default.user=root
, dan wanneer ingelogd als root
voer in de MySQL-server de volgende query's uit:
GRANT USAGE ON *.* TO 'root'@'%' REQUIRE SSL;
FLUSH PRIVILEGES;