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;