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

Java 如何使用Play Framework通过SSL连接到远程MySQL数据库?,java,mysql,scala,playframework,amazon-rds,Java,Mysql,Scala,Playframework,Amazon Rds,我在分布式环境中部署Play应用程序,由远程MySQL数据库支持。具体来说,应用程序托管在heroku上,数据库位于AmazonRDS上(尽管这实际上适用于任何远程数据库连接)。由于数据库不仅仅位于localhost上,为了安全起见,我更希望通过SSL建立远程MySQL连接 如果要信任CA证书,我如何配置Play应用程序以通过SSL连接到MySQL服务器,前提是可以验证主机证书 假设这是当前的数据库配置: db.default.driver=com.mysql.jdbc.Driver db.de

我在分布式环境中部署Play应用程序,由远程MySQL数据库支持。具体来说,应用程序托管在heroku上,数据库位于AmazonRDS上(尽管这实际上适用于任何远程数据库连接)。由于数据库不仅仅位于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="...."

假设您已经为MySQL服务器设置了CA证书(使用AmazonRDS时就是这样),那么有几个步骤可以实现这一点

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

keytool -import -alias mysqlServerCACert -file mysql-ssl-ca-cert.pem -keystore truststore.jks
它将在提示您输入密钥库密码并询问您是否要信任证书(是的,您需要)后创建一个名为
truststore.jks
的新Java密钥库文件。如果您已经有一个信任库文件,您可以运行相同的命令,用现有密钥库的路径替换
truststore.jks
(然后会提示您输入现有密钥库的密码)。我通常将
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服务器以配置truststore MySQL连接器/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;
只是想更新一下

  • 您可以从这里下载包含许多Amazon证书的捆绑证书
  • 如果您看到该pem的内容,它包含许多证书。将其拆分为多个PEM文件,每个文件将包含如下内容

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

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

  • 为了让您的生活更轻松,有人刚刚为此创建了bash脚本:

    注意:这不是特定于Play Framework的,更多的是一般的Java/MySQL,无需在
    授予之后
    刷新权限。如果您直接修改mysql.*表,则只需要这样做。