假设您已经为 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;