![](/img/trans.png)
[英]Laravel database connection times out but can connect via mysql command
[英]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;
只是为了更新所有。
如果您看到该 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 脚本: https : //gist.github.com/shareefhiasat/dabe5e96dbd7123c7b101aac1c0eca8a
使用 ssl 连接到 mysql 的步骤:假设您有 <ca-cert>.pem、<cert-x509-filepath>.pem、<key-filepath.pem> 文件
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
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.