繁体   English   中英

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

[英]How to connect to a remote MySQL database via SSL using Play Framework?

我在分布式环境中部署 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 时就是这种情况),有几个步骤可以完成这项工作。

首先,应该使用 JDK 附带的keytool将 CA 证书导入到 Java KeyStore 文件中。 在这种情况下,KeyStore 将包含我们想要信任的所有 CA 证书。 对于 Amazon RDS,可以在此处找到 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替换为现有密钥库的路径(然后会提示您输入现有密钥库的密码)。 我通常将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 ,那么当以root身份登录 MySQL 服务器时,运行以下查询:

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

只是为了更新所有。

  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

使用 ssl 连接到 mysql 的步骤:假设您有 <ca-cert>.pem、<cert-x509-filepath>.pem、<key-filepath.pem> 文件

  1. 创建 java 密钥库和信任库文件
  • 要生成信任库文件:

    keytool -importcert -alias datahighway-ts -file <ca-cert>.pem -keystore <truststore-filepath>.jks -storepass mypassword

  • 要生成密钥库文件:

    openssl pkcs12 -export -in <cert-x509-filepath>.pem -inkey <key-filepath.pem> -out <cert-filepath>.p12 -name "datahighway-cert"

    keytool -importkeystore -srckeystore <证书文件路径>.p12 -srcstoretype pkcs12 -destkeystore <密钥库证书文件路径>.jks

  1. 在 jdbc url 中使用生成的密钥库和信任库文件:

jdbc:mysql://<host>:<port>/<dbname>?useSSL=true&requireSSL=true&sslMode=VERIFY_CA&clientCertificateKeyStoreUrl=file:<keystore-cert-filepath>.jks&clientCertificateKeyStorePassword=mypassword&verifyServerCertificate=true&trustCertificateKeyStoreUrl=file:<truststore-filepath>. jks&trustCertificateKeyStorePassword=我的密码

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM