Förutsatt att du redan har CA-certifikatinställningen för MySQL-servern (vilket är fallet när du använder Amazon RDS), finns det några steg för att få detta att fungera.
Först bör CA-certifikatet importeras till en Java KeyStore-fil med nyckelverktyg
, som följer med JDK. KeyStore kommer i det här fallet att innehålla alla CA-certifikat vi vill lita på. För Amazon RDS kan CA-certifikatet hittas här
. Med mysql-ssl-ca-cert.pem
i din arbetskatalog kan du köra följande kommando:
keytool -import -alias mysqlServerCACert -file mysql-ssl-ca-cert.pem -keystore truststore.jks
Vilket kommer att skapa en ny Java KeyStore-fil som heter truststore.jks
efter att ha uppmanat dig att ange ett KeyStore-lösenord och fråga om du vill lita på certifikatet (ja, det gör du). Om du redan har en truststore-fil kan du köra samma kommando och ersätta truststore.jks
med sökvägen till din befintliga KeyStore (du kommer då att bli tillfrågad om lösenordet för den befintliga KeyStore istället). Jag brukar placera truststore.jks
i min conf
katalog.
För det andra i application.conf
du måste lägga till några JDBC URL-parametrar till databasens URL:
verifyServerCertificate=true
- Vägra att ansluta om värdcertifikatet inte kan verifieras.
useSSL=true
- Anslut med SSL.
requireSSL=true
- Vägra att ansluta om MySQL-servern inte stöder SSL.
Till exempel, om din nuvarande databas-URL är:
db.default.url="jdbc:mysql://url.to.database/test_db"
Då borde det nu vara:
db.default.url="jdbc:mysql://url.to.database/test_db?verifyServerCertificate=true&useSSL=true&requireSSL=true"
Slutligen finns det några kommandoradsalternativ som måste skickas när du startar Play-servern för att konfigurera truststore MySQL-Connector/J kommer att använda. Förutsatt min truststore.jks
filen finns i conf
katalog, och lösenordet är password
, skulle jag starta min server (i dev-läge) så här:
activator run -Djavax.net.ssl.trustStore="conf/truststore.jks" -Djavax.net.ssl.trustStorePassword="password"
Utöver detta vill jag också se till att det är omöjligt att ansluta till databasen utan att använda SSL, ifall alternativen på något sätt blir trassliga på applikationsnivå. Till exempel om db.default.user=root
, sedan när du är inloggad som root
i MySQL-servern, kör följande frågor:
GRANT USAGE ON *.* TO 'root'@'%' REQUIRE SSL;
FLUSH PRIVILEGES;