tutorial run plugin play learn intellij idea framework examples español java mysql scala playframework amazon-rds

java - run - sbt plugin eclipse



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

Implemento aplicaciones Play en entornos distribuidos, respaldados por una base de datos MySQL remota. Específicamente, las aplicaciones están alojadas en heroku, y la base de datos está en Amazon RDS (aunque esto realmente se aplica a cualquier conexión de base de datos remota). Dado que la base de datos no está solo en localhost, prefiero que la conexión remota de MySQL se realice a través de SSL por seguridad.

Si se confía un certificado de CA, ¿cómo puedo configurar una aplicación Play para conectarme al servidor MySQL a través de SSL, solo si se puede verificar el certificado del host?

Supongamos que esto es la configuración de base de datos actual:

db.default.driver=com.mysql.jdbc.Driver db.default.url="jdbc:mysql://url.to.database/test_db" db.default.user=root db.default.password="...."


Jut para actualizar en todos.

  1. Puede descargar el certificado de paquete que contiene muchos certificados de Amazon desde aquí https://s3.amazonaws.com/rds-downloads/rds-combined-ca-bundle.pem .
  2. Si ves el contenido de ese pem contiene muchos certificados. Dividirlo en varios archivos PEM donde cada archivo contendrá así

    -----BEGIN CERTIFICATE----- [main content] -----END CERTIFICATE-----

  3. Luego ejecute este comando para cada archivo de certificado que haya creado.

    keytool -import / -keystore $JAVA_HOME/jre/lib/security/cacerts / -storepass changeit -noprompt / -alias $ALIAS -file $YOUR_INDIVIDUAL_PEM_FILE

Solo por hacer la vida más fácil, alguien acaba de crear un script bash para esto: https://gist.github.com/shareefhiasat/dabe5e96dbd7123c7b101aac1c0eca8a


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

Primero, el certificado de CA se debe importar a un archivo Java KeyStore usando keytool , que viene con el JDK. El KeyStore en este caso contendrá todos los certificados de CA en los que queremos confiar. Para Amazon RDS, el certificado CA se puede encontrar here . 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 truststore.jks que ingrese una contraseña de KeyStore y le pregunte si desea confiar en el certificado (sí, lo hace). Si ya tiene un archivo de almacén de confianza, puede ejecutar el mismo comando, reemplazando truststore.jks con la ruta de acceso a su Almacén de claves existente (en su lugar, se le solicitará la contraseña del Almacén de claves existente). Normalmente truststore.jks en mi directorio conf .

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

verifyServerCertificate=true : se niega a conectarse si el certificado del host no se puede verificar.

useSSL=true - Conectar utilizando SSL.

requireSSL=true : se niega 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 debería ser ahora:

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 se deben pasar al iniciar el servidor de Play para configurar el almacén de confianza que MySQL-Connector / J usará. Suponiendo que mi archivo truststore.jks se encuentra en el directorio conf , y la contraseña es password , iniciaría mi servidor (en modo dev) de esta manera:

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 de alguna manera se desordenen en el nivel de la aplicación. Por ejemplo, si db.default.user=root , cuando inicie sesión como root en el servidor MySQL, ejecute las siguientes consultas:

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