Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Como se conectar a um banco de dados MySQL remoto via SSL usando o Play Framework?


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;