【问题标题】:How to connect to a remote MySQL database via SSL using Play Framework?如何使用 Play Framework 通过 SSL 连接到远程 MySQL 数据库?
【发布时间】:2014-12-17 22:56:12
【问题描述】:

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

【问题讨论】:

  • 注意:这不是特定于 Play 框架的,更多的是一般 Java / MySQL 的东西

标签: java mysql scala playframework amazon-rds


【解决方案1】:

假设您已经为 MySQL 服务器设置了 CA 证书(使用 Amazon RDS 时就是这种情况),有几个步骤可以完成这项工作。

首先,应该使用 JDK 附带的 keytool 将 CA 证书导入 Java KeyStore 文件。在这种情况下,KeyStore 将包含我们想要信任的所有 CA 证书。对于 Amazon RDS,可以在 here 找到 CA 证书。在您的工作目录中使用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;

【讨论】:

  • GRANT… 之后不需要FLUSH PRIVILEGES。如果你直接修改了 mysql.* 表,你只需要这样做。
【解决方案2】:

只是为了更新所有。

  1. 您可以从这里https://s3.amazonaws.com/rds-downloads/rds-combined-ca-bundle.pem下载包含许多亚马逊证书的捆绑证书。
  2. 如果您看到该 pem 的内容,它包含许多证书。将其拆分为多个 PEM 文件,每个文件将包含这样的内容

    -----BEGIN CERTIFICATE-----
        [main content]
    -----END CERTIFICATE-----
    
  3. 然后为您创建的每个证书文件运行此命令

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

只是为了让您的生活更轻松,有人为此创建了 bash 脚本:https://gist.github.com/shareefhiasat/dabe5e96dbd7123c7b101aac1c0eca8a

【讨论】:

    猜你喜欢
    • 2015-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-30
    • 2017-10-19
    • 2016-11-05
    • 2011-05-18
    相关资源
    最近更新 更多