如何使用Play框架通过SSL连接到远程MySQL数据库?

2022-09-02 02:44:06

我在分布式环境中部署Play应用程序,由远程MySQL数据库提供支持。具体而言,应用程序托管在 heroku 上,数据库托管在 Amazon RDS 上 (尽管这确实适用于任何远程数据库连接)。由于数据库不仅仅在localhost上,为了安全起见,我更喜欢通过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="...."

答案 1

假设您已经为 MySQL 服务器设置了 CA 证书(使用 Amazon RDS 时就是这种情况),则有几个步骤可以实现此目的。

首先,应使用 JDK 附带的 keytool 将 CA 证书导入到 Java KeyStore 文件中。在这种情况下,密钥库将包含我们要信任的所有 CA 证书。对于 Amazon RDS,可在此处找到 CA 证书。在工作目录中,您可以运行以下命令:mysql-ssl-ca-cert.pem

keytool -import -alias mysqlServerCACert -file mysql-ssl-ca-cert.pem -keystore truststore.jks

这将创建一个新的 Java KeyStore 文件,在提示您输入 KeyStore 密码并询问您是否要信任该证书(是的,您愿意)之后调用该文件。如果您已经有一个信任库文件,则可以运行相同的命令,替换为现有密钥库的路径(然后系统将提示您输入现有密钥库的密码)。我通常放在我的目录中。truststore.jkstruststore.jkstruststore.jksconf

其次,您需要向数据库URL添加一些JDBC URL参数:application.conf

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.jksconfpassword

activator run -Djavax.net.ssl.trustStore="conf/truststore.jks" -Djavax.net.ssl.trustStorePassword="password"

除此之外,我还想确保在不使用SSL的情况下不可能连接到数据库,以防万一选项在应用程序级别以某种方式搞砸了。例如,如果 ,则在 MySQL 服务器中登录时,运行以下查询:db.default.user=rootroot

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

答案 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


推荐