java - 如何使用 Play Framework 通过 SSL 连接到远程 MySQL 数据库?

标签 java mysql scala playframework amazon-rds

我在分布式环境中部署 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/

相关文章:

java - Android - 从 url 下载 JSON 文件

java - Lucene 面试题

java - 如何使用运行时参数创建原型(prototype)范围的 @Bean?使用 getBean(String name, Object...args)?

java - 加速 jasperreports

php - 我想将 MySQL 查询转换为 PDO?

parsing - 接近 Scala 中的文本解析

java - jOOQ - MySQL 多行插入...使用 VALUES() 函数进行重复键更新

MySql/Cloudbees VARCHAR 作为外键

float 步长的标度范围精度

scala - 描述 Slick 中的可选字段