リモートMySQLデータベースに支えられた分散環境にPlayアプリケーションをデプロイします。具体的には、アプリケーションはherokuでホストされ、データベースはAmazon RDSにあります(ただし、これは実際にリモートデータベース接続に適用されます)。データベースはローカルホストだけにあるのではないので、リモートMySQL接続はセキュリティのためにSSL経由で行われることを希望します。
信頼するCA証明書が与えられた場合、ホスト証明書を検証できる場合にのみ、SSLを介してMySQLサーバーに接続するようにPlayアプリケーションを構成するにはどうすればよいですか?
これを現在のデータベース構成と仮定します。
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を使用する場合)、この作業を行うためのいくつかの手順があります。
まず、CA証明書をJava KeyStoreファイルに keytool を使用してインポートする必要があります。これはJDKに付属しています。この場合のKeyStoreにはすべてのCA証明書が含まれますAmazon RDSの場合、CA証明書は here にあります。作業ディレクトリで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
を既存のキーストアへのパスに置き換えて同じコマンドを実行できます(代わりに、既存のキーストアのパスワードの入力を求められます)。通常、conf
ディレクトリにtruststore.jks
を配置します。
次に、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"
最後に、MySQL-Connector/Jが使用するトラストストアを設定するためにPlayサーバーを起動するときに渡す必要のあるコマンドラインオプションがいくつかあります。 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;
すべてを更新するだけです。
その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