Supondo que você já tenha a configuração do certificado de CA para o servidor MySQL (que é o caso ao usar o Amazon RDS), há algumas etapas para fazer isso funcionar.
Primeiro, o certificado CA deve ser importado para um arquivo Java KeyStore usando ferramenta de chave , que vem com o JDK. O KeyStore neste caso conterá todos os certificados de CA em que queremos confiar. Para o Amazon RDS, o certificado da CA pode ser encontrado aqui . Com
mysql-ssl-ca-cert.pem
em seu diretório de trabalho, você pode executar o seguinte comando:keytool -import -alias mysqlServerCACert -file mysql-ssl-ca-cert.pem -keystore truststore.jks
Que criará um novo arquivo Java KeyStore chamado
truststore.jks
depois de solicitar que você insira uma senha do KeyStore e perguntar se deseja confiar no certificado (sim, você quer). Se você já tiver um arquivo de armazenamento confiável, poderá executar o mesmo comando, substituindo truststore.jks
com o caminho para o seu KeyStore existente (em vez disso, você será solicitado a fornecer a senha do KeyStore existente). Eu costumo colocar truststore.jks
no meu conf
diretório. Segundo, em
application.conf
você precisa adicionar alguns parâmetros de URL JDBC ao URL do banco de dados:verifyServerCertificate=true
- Recuse-se a conectar se o certificado do host não puder ser verificado. useSSL=true
- Conecte-se usando SSL. requireSSL=true
- Recuse-se a conectar se o servidor MySQL não suportar SSL. Por exemplo, se a URL do seu banco de dados atual for:
db.default.url="jdbc:mysql://url.to.database/test_db"
Então agora deve ser:
db.default.url="jdbc:mysql://url.to.database/test_db?verifyServerCertificate=true&useSSL=true&requireSSL=true"
Por fim, existem algumas opções de linha de comando que precisam ser passadas ao iniciar o servidor Play para configurar o armazenamento confiável que o MySQL-Connector/J usará. Assumindo meu
truststore.jks
arquivo está localizado no conf
diretório e a senha é password
, eu iniciaria meu servidor (no modo dev) assim:activator run -Djavax.net.ssl.trustStore="conf/truststore.jks" -Djavax.net.ssl.trustStorePassword="password"
Além disso, também gosto de ter certeza de que é impossível se conectar ao banco de dados sem usar SSL, caso as opções de alguma forma fiquem confusas no nível do aplicativo. Por exemplo, se
db.default.user=root
, então quando logado como root
no servidor MySQL, execute as seguintes consultas:GRANT USAGE ON *.* TO 'root'@'%' REQUIRE SSL;
FLUSH PRIVILEGES;