我在分布式环境中部署 Play 应用程序,由远程 MySQL 数据库提供支持。具体来说,应用程序托管在 heroku 上,数据库在 Amazon RDS 上(尽管这确实适用于任何远程数据库连接)。由于数据库不只是在本地主机上,为了安全起见,我更喜欢通过 SSL 建立远程 MySQL 连接。
给定一个要信任的 CA 证书,我如何配置 Play 应用程序以通过 SSL 连接到 MySQL 服务器,前提是主机证书可以验证?
假设这是当前的数据库配置:
db.default.driver=com.mysql.jdbc.Driver
db.default.url="jdbc:mysql://url.to.database/test_db"
db.default.user=root
db.default.password="...."
最佳答案
假设您已经为 MySQL 服务器设置了 CA 证书(使用 Amazon RDS 时就是这种情况),有几个步骤可以完成这项工作。
首先,应该使用 keytool 将 CA 证书导入到 Java KeyStore 文件中。 , 随 JDK 一起提供。在这种情况下,KeyStore 将包含我们想要信任的所有 CA 证书。对于 Amazon RDS,CA 证书位于 here .在您的工作目录中使用 mysql-ssl-ca-cert.pem
,您可以运行以下命令:
keytool -import -alias mysqlServerCACert -file mysql-ssl-ca-cert.pem -keystore truststore.jks
在提示您输入 KeyStore 密码并询问您是否要信任证书(是的,您愿意)之后,这将创建一个名为 truststore.jks
的新 Java KeyStore 文件。如果您已经有一个信任库文件,您可以运行相同的命令,将 truststore.jks
替换为您现有 KeyStore 的路径(然后会提示您输入现有 KeyStore 的密码) .我通常将 truststore.jks
放在我的 conf
目录中。
其次,在application.conf
中需要在数据库URL中添加几个JDBC URL参数:
verifyServerCertificate=true
- 如果无法验证主机证书,则拒绝连接。
useSSL=true
- 使用 SSL 连接。
requireSSL=true
- 如果 MySQL 服务器不支持 SSL,则拒绝连接。
例如,如果您当前的数据库 URL 是:
db.default.url="jdbc:mysql://url.to.database/test_db"
那么现在应该是:
db.default.url="jdbc:mysql://url.to.database/test_db?verifyServerCertificate=true&useSSL=true&requireSSL=true"
最后,在启动 Play 服务器以配置 MySQL-Connector/J 将使用的信任库时,需要传递一些命令行选项。假设我的 truststore.jks
文件位于 conf
目录中,并且密码是 password
,我将启动我的服务器(在开发模式下)像这样:
activator run -Djavax.net.ssl.trustStore="conf/truststore.jks" -Djavax.net.ssl.trustStorePassword="password"
除此之外,我还想确保不使用 SSL 就无法连接到数据库,以防万一选项在应用程序级别出现困惑。例如,如果 db.default.user=root
,那么当在 MySQL 服务器中以 root
身份登录时,运行以下查询:
GRANT USAGE ON *.* TO 'root'@'%' REQUIRE SSL;
FLUSH PRIVILEGES;
关于java - 如何使用 Play Framework 通过 SSL 连接到远程 MySQL 数据库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27536380/