Forudsat at du allerede har CA-certifikatopsætningen til MySQL-serveren (hvilket er tilfældet, når du bruger Amazon RDS), er der et par trin til at få dette til at fungere.
Først skal CA-certifikatet importeres til en Java KeyStore-fil ved hjælp af nøgleværktøj
, som følger med JDK. KeyStore vil i dette tilfælde indeholde alle de CA-certifikater, vi ønsker at stole på. For Amazon RDS kan CA-certifikatet findes her
. Med mysql-ssl-ca-cert.pem
i din arbejdsmappe, kan du køre følgende kommando:
keytool -import -alias mysqlServerCACert -file mysql-ssl-ca-cert.pem -keystore truststore.jks
Hvilket vil skabe en ny Java KeyStore-fil kaldet truststore.jks
efter at have bedt dig om at indtaste en KeyStore-adgangskode og spørge, om du vil have tillid til certifikatet (ja, det gør du). Hvis du allerede har en truststore-fil, kan du køre den samme kommando og erstatte truststore.jks
med stien til din eksisterende KeyStore (du bliver i stedet bedt om adgangskoden til den eksisterende KeyStore). Jeg plejer at placere truststore.jks
i min conf
bibliotek.
For det andet i application.conf
du skal tilføje et par JDBC URL-parametre til databasens URL:
verifyServerCertificate=true
- Nægt at oprette forbindelse, hvis værtscertifikatet ikke kan verificeres.
useSSL=true
- Opret forbindelse ved hjælp af SSL.
requireSSL=true
- Nægt at oprette forbindelse, hvis MySQL-serveren ikke understøtter SSL.
For eksempel, hvis din aktuelle database-URL er:
db.default.url="jdbc:mysql://url.to.database/test_db"
Så skulle det nu være:
db.default.url="jdbc:mysql://url.to.database/test_db?verifyServerCertificate=true&useSSL=true&requireSSL=true"
Til sidst er der et par kommandolinjeindstillinger, der skal videregives, når Play-serveren startes for at konfigurere den truststore, som MySQL-Connector/J vil bruge. Forudsat min truststore.jks
filen er placeret i conf
bibliotek, og adgangskoden er password
, ville jeg starte min server (i dev-tilstand) sådan her:
activator run -Djavax.net.ssl.trustStore="conf/truststore.jks" -Djavax.net.ssl.trustStorePassword="password"
Ud over dette vil jeg også gerne sørge for, at det er umuligt at oprette forbindelse til databasen uden at bruge SSL, bare hvis mulighederne på en eller anden måde bliver rodet sammen på applikationsniveau. For eksempel hvis db.default.user=root
, når du er logget ind som root
i MySQL-serveren skal du køre følgende forespørgsler:
GRANT USAGE ON *.* TO 'root'@'%' REQUIRE SSL;
FLUSH PRIVILEGES;