web-dev-qa-db-ja.com

Play Frameworkを使用してSSL経由でリモートMySQLデータベースに接続する方法は?

リモート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="...."
19
Michael Zajac

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;
40
Michael Zajac

すべてを更新するだけです。

  1. Amazonの多くの証明書を含むバンドル証明書をここからダウンロードできます 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

1
privatejava