sql >> Base de Datos >  >> RDS >> Mysql

¿Cómo conectarse a una base de datos MySQL remota a través de SSL usando Play Framework?

Suponiendo que ya tiene la configuración del certificado de CA para el servidor MySQL (que es el caso cuando se usa Amazon RDS), existen algunos pasos para que esto funcione.

Primero, el certificado de CA debe importarse a un archivo Java KeyStore usando herramienta de teclas , que viene con el JDK. KeyStore en este caso contendrá todos los certificados de CA en los que queremos confiar. Para Amazon RDS, el certificado de CA se puede encontrar aquí . Con mysql-ssl-ca-cert.pem en su directorio de trabajo, puede ejecutar el siguiente comando:

keytool -import -alias mysqlServerCACert -file mysql-ssl-ca-cert.pem -keystore truststore.jks

Lo que creará un nuevo archivo Java KeyStore llamado truststore.jks después de pedirle que ingrese una contraseña de KeyStore y preguntarle si desea confiar en el certificado (sí, lo desea). Si ya tiene un archivo de almacén de confianza, puede ejecutar el mismo comando, reemplazando truststore.jks con la ruta a su KeyStore existente (luego se le pedirá la contraseña del KeyStore existente, en su lugar). Normalmente coloco truststore.jks en mi conf directorio.

Segundo, en application.conf debe agregar algunos parámetros de URL de JDBC a la URL de la base de datos:

verifyServerCertificate=true - Negarse a conectarse si no se puede verificar el certificado del host.

useSSL=true - Conéctate usando SSL.

requireSSL=true - Negarse a conectarse si el servidor MySQL no es compatible con SSL.

Por ejemplo, si la URL de su base de datos actual es:

db.default.url="jdbc:mysql://url.to.database/test_db"

Entonces ahora debería ser:

db.default.url="jdbc:mysql://url.to.database/test_db?verifyServerCertificate=true&useSSL=true&requireSSL=true"

Por último, hay algunas opciones de línea de comandos que deben pasarse al iniciar el servidor Play para configurar el almacén de confianza que usará MySQL-Connector/J. Asumiendo mi truststore.jks El archivo se encuentra en el conf directorio, y la contraseña es password , iniciaría mi servidor (en modo desarrollador) así:

activator run -Djavax.net.ssl.trustStore="conf/truststore.jks" -Djavax.net.ssl.trustStorePassword="password"

Además de esto, también me gusta asegurarme de que es imposible conectarse a la base de datos sin usar SSL, en caso de que las opciones se estropeen de alguna manera a nivel de la aplicación. Por ejemplo, si db.default.user=root , luego cuando inicie sesión como root en el servidor MySQL, ejecute las siguientes consultas:

GRANT USAGE ON *.* TO 'root'@'%' REQUIRE SSL;
FLUSH PRIVILEGES;