Zakładając, że masz już konfigurację certyfikatu CA dla serwera MySQL (co ma miejsce w przypadku korzystania z Amazon RDS), istnieje kilka kroków, aby to zadziałało.
Najpierw certyfikat CA należy zaimportować do pliku Java KeyStore przy użyciu klucz
, który jest dostarczany z JDK. Magazyn kluczy w tym przypadku będzie zawierał wszystkie certyfikaty CA, którym chcemy ufać. W przypadku Amazon RDS certyfikat CA można znaleźć tutaj
. Z mysql-ssl-ca-cert.pem
w swoim katalogu roboczym możesz uruchomić następujące polecenie:
keytool -import -alias mysqlServerCACert -file mysql-ssl-ca-cert.pem -keystore truststore.jks
Który utworzy nowy plik Java KeyStore o nazwie truststore.jks
po wyświetleniu monitu o podanie hasła KeyStore i pytanie, czy chcesz zaufać certyfikatowi (tak, masz). Jeśli masz już plik truststore, możesz uruchomić to samo polecenie, zastępując truststore.jks
ze ścieżką do istniejącego magazynu kluczy (zamiast tego zostanie wyświetlony monit o hasło do istniejącego magazynu kluczy). Zwykle umieszczam truststore.jks
w moim conf
katalog.
Po drugie, w application.conf
musisz dodać kilka parametrów adresu URL JDBC do adresu URL bazy danych:
verifyServerCertificate=true
- Odmów połączenia, jeśli nie można zweryfikować certyfikatu hosta.
useSSL=true
- Połącz za pomocą SSL.
requireSSL=true
- Odmów połączenia, jeśli serwer MySQL nie obsługuje SSL.
Na przykład, jeśli aktualny adres URL bazy danych to:
db.default.url="jdbc:mysql://url.to.database/test_db"
W takim razie powinno być teraz:
db.default.url="jdbc:mysql://url.to.database/test_db?verifyServerCertificate=true&useSSL=true&requireSSL=true"
Na koniec istnieje kilka opcji wiersza poleceń, które należy przekazać podczas uruchamiania serwera Play, aby skonfigurować plik truststore, którego będzie używać MySQL-Connector/J. Zakładając, że mój truststore.jks
plik znajduje się w conf
katalogu, a hasło to password
, uruchomiłbym serwer (w trybie deweloperskim) w ten sposób:
activator run -Djavax.net.ssl.trustStore="conf/truststore.jks" -Djavax.net.ssl.trustStorePassword="password"
Oprócz tego lubię się upewnić, że nie można połączyć się z bazą danych bez użycia SSL, na wypadek, gdyby opcje zostały jakoś pomieszane na poziomie aplikacji. Na przykład, jeśli db.default.user=root
, a następnie po zalogowaniu się jako root
na serwerze MySQL uruchom następujące zapytania:
GRANT USAGE ON *.* TO 'root'@'%' REQUIRE SSL;
FLUSH PRIVILEGES;