Как подключиться к удаленной базе данных MySQL через SSL с помощью Play Framework?

Я развертываю приложения Play в распределенных средах, поддерживаемые удаленной базой данных MySQL. В частности, приложения размещаются на heroku, а база данных находится на Amazon RDS (хотя это действительно относится к любому удаленному соединению с базой данных). Поскольку база данных не только на локальном хосте, я бы предпочел, чтобы удаленное соединение с MySQL было выполнено с помощью SSL для обеспечения безопасности.

Учитывая, что сертификат CA доверяет, как настроить приложение Play для подключения к серверу MySQL через SSL, только если сертификат хоста может быть проверен?

Предположим, что это текущая конфигурация базы данных:

db.default.driver=com.mysql.jdbc.Driver
db.default.url="jdbc:mysql://url.to.database/test_db"
db.default.user=root 
db.default.password="...."

Ответы

Ответ 1

Предполагая, что у вас уже есть настройка сертификата CA для сервера MySQL (что имеет место при использовании Amazon RDS), есть несколько шагов, чтобы сделать эту работу.

Сначала сертификат CA должен быть импортирован в файл Java KeyStore с помощью keytool, который поставляется вместе с JDK. KeyStore в этом случае будет содержать все сертификаты CA, которым мы хотим доверять. Для Amazon RDS сертификат CA можно найти здесь. С mysql-ssl-ca-cert.pem в вашем рабочем каталоге вы можете запустить следующую команду:

keytool -import -alias mysqlServerCACert -file mysql-ssl-ca-cert.pem -keystore truststore.jks

Что создаст новый файл Java KeyStore под названием truststore.jks после запроса ввести пароль 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"

Наконец, есть несколько параметров командной строки, которые должны быть переданы при запуске сервера воспроизведения для настройки Truststore MySQL-Connector/J. Предполагая, что мой файл truststore.jks находится в каталоге conf, а пароль password, я бы начал свой сервер (в режиме dev) следующим образом:

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;