Отключить аутентификацию клиента MySQL RDS - PullRequest
0 голосов
/ 25 февраля 2019

Я пытаюсь подключиться к базе данных MySQL RDS из приложения Java SpringBoot.Я внес необходимые изменения в БД.

ALTER USER 'my_app'@'%' require SSL;
GRANT USAGE ON *.* TO 'my_app'@'%' REQUIRE SSL;

Однако соединение не происходит.Это сбой в части аутентификации клиента.Сервер (mysql db) не может аутентифицировать клиента (Java-приложение).

Вопрос:

  • Как отключить аутентификацию клиента?Основываясь на документации, она должна быть отключена, если вы не выполните команду «REQUIRE X509».Итак, я запутался в этом.Документация, на которую я ссылаюсь, такова: https://dev.mysql.com/doc/refman/8.0/en/alter-user.html.

  • Как я могу сделать эту работу, используя и keyStore, и trustStore?

Дополнительная информация:

Я также импортировал корневой и региональный сертификат AWS в мое хранилище доверия.На этом этапе (без хранилища ключей, переданного как JVM), соединение происходит нормально.

Однако в моем приложении мне также необходимо использовать хранилище ключей.

 -Djavax.net.ssl.keyStore=path/keyStore.jks
 -Djavax.net.ssl.keyStorePassword=<keyStore_password>

Когда я выполняюэто, соединение не происходит, и выдается следующая ошибка:

main, handling exception: javax.net.ssl.SSLHandshakeException: Received fatal alert: unknown_ca
com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure

Добавление отладки ssl рукопожатия Я вижу следующие журналы:

*** CertificateRequest
Cert Types: RSA, DSS, ECDSA
Cert Authorities:
<Empty>
localhost-startStop-1, READ: TLSv1.1 Handshake, length = 4
*** ServerHelloDone
matching alias: mysqlrds
matching alias: client-nonprod
*** Certificate chain
chain [0] = [

Похоже, что это сбой вчасть, где сервер (БД mysql) пытается проверить клиента (приложение Java).На следующих шагах клиент (java-приложение) должен предоставить сертификат серверу (mysql db).

На шаге выше (CertificateRequest) сервер отправляет пустые «Cert Authorities».Что обычно означает, что сервер (mysql db) имеет пустое или не инициализированное хранилище доверия.После этого (цепочка сертификатов) клиент (приложение java) отправляет на сервер (mysql db) сертификат.В этом случае "keyStore_cert.jks".Но сервер не знает об этом и выдает ошибку на рукопожатие.

Пример кода:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

//1. Dowload my sql connector to a folder "jars". http://central.maven.org/maven2/mysql/mysql-connector-java/8.0.13/mysql-connector-java-8.0.13.jar
//   This file and the jars folder are on the same folder (or level). Not inside one another.
//2. edit this file to have your settings. Name of the DB,URL,username,password,trustStore,keyStore,DB name, table name.
//3. compile the file:  javac -cp ".:./jars/mysql-connector-java-8.0.13.jar"  SampleCode.java
//4. run the program:   java -cp ".:./jars/mysql-connector-java-8.0.13.jar"  SampleCode

public class SampleCode {
  public static void main(String[] args) {
    Connection con;
    try {
      // TODO: replace with your settings.
      System.setProperty("javax.net.ssl.trustStore", "path/resource/certs/trustStore.jks");
      System.setProperty("javax.net.ssl.trustStorePassword", "trustStore_pass");
      System.setProperty("javax.net.ssl.keyStore", "path/resource/certs/keyStore.jks");
      System.setProperty("javax.net.ssl.keyStorePassword", "keyStore_pass");
      System.setProperty("javax.net.debug", "ssl:handshake");

      Class.forName("com.mysql.cj.jdbc.Driver");
      // TODO: replace with your settings.
      con = DriverManager.getConnection(
          "jdbc:mysql://my_db_name.random_string.us-east-1.rds.amazonaws.com:3/my_db?useLegacyDatetimeCode=false&verifyServerCertificate=true&useSSL=true&requireSSL=true",
          "my_app", "my_pass");

      System.out.println(" connection successful \n");
      Statement stmt = con.createStatement();
      ResultSet rs = stmt.executeQuery("SELECT * FROM my_table "); // TODO: replace with yours.
      while (rs.next()) {
        System.out.println("id : " + rs.getString("id"));
      }

      rs.close();
      stmt.close();
      con.close();
    } catch (Exception e) {
      System.out.println(e);
    }
  }
}

Справочные материалы:

...