Supponendo che tu abbia già la configurazione del certificato CA per il server MySQL (come avviene quando si utilizza Amazon RDS), ci sono alcuni passaggi per farlo funzionare.
Innanzitutto, il certificato CA deve essere importato in un file Java KeyStore utilizzando strumento chiavi
, fornito con JDK. Il KeyStore in questo caso conterrà tutti i certificati CA di cui vogliamo fidarci. Per Amazon RDS, il certificato CA è disponibile qui
. Con mysql-ssl-ca-cert.pem
nella tua directory di lavoro, puoi eseguire il seguente comando:
keytool -import -alias mysqlServerCACert -file mysql-ssl-ca-cert.pem -keystore truststore.jks
Ciò creerà un nuovo file Java KeyStore chiamato truststore.jks
dopo aver chiesto di inserire una password KeyStore e aver chiesto se si desidera considerare attendibile il certificato (sì, lo fai). Se hai già un file truststore, puoi eseguire lo stesso comando, sostituendo truststore.jks
con il percorso del tuo KeyStore esistente (ti verrà quindi richiesta la password del KeyStore esistente). Di solito inserisco truststore.jks
nel mio conf
directory.
Secondo, in application.conf
è necessario aggiungere alcuni parametri URL JDBC all'URL del database:
verifyServerCertificate=true
- Rifiuta di connetterti se non è possibile verificare il certificato host.
useSSL=true
- Connessione tramite SSL.
requireSSL=true
- Rifiuta di connetterti se il server MySQL non supporta SSL.
Ad esempio, se l'URL del database corrente è:
db.default.url="jdbc:mysql://url.to.database/test_db"
Quindi ora dovrebbe essere:
db.default.url="jdbc:mysql://url.to.database/test_db?verifyServerCertificate=true&useSSL=true&requireSSL=true"
Infine, ci sono alcune opzioni della riga di comando che devono essere passate all'avvio del server di riproduzione per configurare il truststore che MySQL-Connector/J utilizzerà. Supponendo che il mio truststore.jks
il file si trova in conf
directory e la password è password
, Vorrei avviare il mio server (in modalità dev) in questo modo:
activator run -Djavax.net.ssl.trustStore="conf/truststore.jks" -Djavax.net.ssl.trustStorePassword="password"
Oltre a questo, mi piace anche assicurarmi che sia impossibile connettersi al database senza utilizzare SSL, nel caso in cui le opzioni in qualche modo vengano incasinate a livello di applicazione. Ad esempio se db.default.user=root
, quindi una volta effettuato l'accesso come root
nel server MySQL, esegui le seguenti query:
GRANT USAGE ON *.* TO 'root'@'%' REQUIRE SSL;
FLUSH PRIVILEGES;