Aktualisieren von Anwendungen, um Verbindungen mit MySQL-DB-Instances mithilfe neuer SSL/TLS-Zertifikate herzustellen - Amazon Relational Database Service

Aktualisieren von Anwendungen, um Verbindungen mit MySQL-DB-Instances mithilfe neuer SSL/TLS-Zertifikate herzustellen

Am 19. September 2019 veröffentlichte Amazon RDS neue Certificate Authority (CA)-Zertifikate für die Herstellung von Verbindungen mit Ihren RDS-DB-Instances mithilfe von Secure Socket Layer oder Transport Layer Security (SSL/TLS). Im Folgenden finden Sie Informationen dazu, wie Sie Ihre Anwendungen aktualisieren, um die neuen Zertifikate verwenden zu können.

In diesem Thema finden Sie Informationen dazu, wie Sie ermitteln, ob Client-Anwendungen für die Herstellung von Verbindungen mit Ihren DB-Instances SSL/TLS verwenden. Wenn dies der Fall ist, können Sie weiter überprüfen, ob diese Anwendungen zum Herstellen von Verbindungen Zertifikatverifizierungen erfordern.

Anmerkung

Einige Anwendungen sind so konfiguriert, dass sie nur dann Verbindungen mit MySQL-DB-Instances herstellen, wenn sie das Zertifikat auf dem Server erfolgreich identifizieren können. Für solche Anwendungen müssen Sie die Trust Stores Ihrer Client-Anwendungen aktualisieren, damit diese die neuen CA-Zertifikate enthalten.

Sie können die folgenden SSL-Modi angeben: disabled, preferred und required. Wenn Sie den SSL-Modus preferred verwenden und das CA-Zertifikat nicht vorhanden oder nicht aktuell ist, gilt das folgende Verhalten:

  • Bei neueren MySQL-Nebenversionen greift die Verbindung auf die Nichtbenutzung von SSL zurück und verbindet sich weiterhin erfolgreich.

    Da diese späteren Versionen das OpenSSL-Protokoll verwenden, werden erfolgreiche Verbindungen nicht von einem abgelaufenen Serverzertifikat verhindert, es sei denn, der SSL-Modus required wird angegeben.

    Die folgenden MySQL-Nebenversionen verwenden das OpenSSL-Protokoll:

    • Alle MySQL 8.0-Versionen

    • MySQL 5.7.21 und höhere MySQL 5.7-Versionen

    • MySQL 5.6.39 und höhere MySQL 5.6-Versionen

    • MySQL 5.5.59 und höhere MySQL 5.5-Versionen

  • Bei älteren MySQL-Nebenversionen wird ein Fehler zurückgegeben.

    Da diese älteren Versionen das yaSSL-Protokoll verwenden, wird die Zertifikatüberprüfung streng durchgesetzt und die Verbindung ist nicht erfolgreich.

    Die folgenden MySQL-Nebenversionen verwenden das yaSSL-Protokoll:

    • MySQL 5.7.19 und frühere MySQL 5.7-Versionen

    • MySQL 5.6.37 und frühere MySQL 5.6-Versionen

    • MySQL 5.5.57 und frühere MySQL 5.5-Versionen

Nach der Aktualisierung der CA-Zertifikate in den Trust Stores Ihrer Client-Anwendung können Sie die Zertifikate auf Ihren DB-Instances rotieren. Es wird nachdrücklich empfohlen, diese Verfahren vor der Implementierung in Produktionsumgebungen in einer Entwicklungs- oder Testumgebung zu testen.

Weitere Informationen zur Zertifikatrotation finden Sie unter Rotieren Ihrer SSL/TLS-Zertifikate. Weitere Informationen zum Herunterladen von Zertifikaten finden Sie unter Verwenden von SSL/TLS für die Verschlüsselung einer Verbindung zu einer DB-Instance. Informationen zum Verwenden von SSL/TLS mit MySQL-DB-Instances finden Sie unter Verwenden von SSL mit einer MySQL DB-Instance.

Ermitteln, ob Anwendungen Verbindungen mit Ihrer MySQL-DB-Instance mithilfe von SSL herstellen

Wenn Sie Amazon RDS MySQL Version 5.7 oder 8.0 verwenden und das Performance-Schema aktiviert ist, können Sie die folgende Abfrage ausführen, um zu prüfen, ob Verbindungen SSL/TLS verwenden. Informationen zum Aktivieren des Performance-Schemas finden Sie unter Performance Schema Quick Start in der MySQL-Dokumentation.

mysql> SELECT id, user, host, connection_type FROM performance_schema.threads pst INNER JOIN information_schema.processlist isp ON pst.processlist_id = isp.id;

In dieser Beispielausgabe können Sie sehen, dass sowohl Ihre eigene Sitzung (admin), als auch eine als webapp1 angemeldete Anwendung SSL verwenden.

+----+-----------------+------------------+-----------------+ | id | user | host | connection_type | +----+-----------------+------------------+-----------------+ | 8 | admin | 10.0.4.249:42590 | SSL/TLS | | 4 | event_scheduler | localhost | NULL | | 10 | webapp1 | 159.28.1.1:42189 | SSL/TLS | +----+-----------------+------------------+-----------------+ 3 rows in set (0.00 sec)

Wenn Sie Amazon RDS MySQL Version 5.5 oder 5.6 verwenden, können Sie serverseitig nicht ermitteln, ob Anwendungen Verbindungen mithilfe von SSL herstellen oder nicht. Für diese Versionen können Sie ermitteln, ob SSL verwendet wird, indem Sie die Verbindungsmethode der Anwendung untersuchen. Im folgenden Abschnitt finden Sie weitere Informationen dazu, wie Sie die Konfiguration der Client-Verbindung untersuchen können.

Ermitteln, ob ein Client zum Herstellen von Verbindungen Zertifikatverifizierungen erfordert

Sie können überprüfen, ob JDBC-Clients und MySQL-Clients zum Herstellen von Verbindungen Zertifikatverifizierungen erfordern.

JDBC

Das folgende Beispiel mit MySQL Connector/J 8.0 zeigt eine Möglichkeit, wie Sie die JDBC-Verbindungseigenschaften einer Anwendung überprüfen können, um zu ermitteln, ob zum erfolgreichen Herstellen von Verbindungen ein gültiges Zertifikat benötigt wird. Weitere Informationen zu allen JDBC-Verbindungsoptionen für MySQL finden Sie unter Configuration Properties in der MySQL-Dokumentation.

Wenn MySQL Connector/J 8.0 verwendet wird, erfordert eine SSL-Verbindung die Verifizierung anhand des CA-Serverzertifikats, wenn in den Verbindungseigenschaften sslMode auf VERIFY_CA oder VERIFY_IDENTITY festgelegt ist, wie im folgenden Beispiel gezeigt.

Properties properties = new Properties(); properties.setProperty("sslMode", "VERIFY_IDENTITY"); properties.put("user", DB_USER); properties.put("password", DB_PASSWORD);
Anmerkung

Wenn Sie entweder den MySQL Java Connector v5.1.38 oder höher oder den MySQL Java Connector v8.0.9 oder höher verwenden, um eine Verbindung mit Ihren Datenbanken herzustellen, verwenden diese Clienttreiber selbst dann, wenn Sie Ihre Anwendungen nicht explizit zur Verwendung von SSL/TLS beim Verbinden mit Ihren Datenbanken konfiguriert haben, standardmäßig SSL/TLS. Darüber hinaus führen sie bei Verwendung von SSL/TLS eine teilweise Zertifikatüberprüfung durch und stellen keine Verbindung her, wenn das Datenbankserverzertifikat abgelaufen ist.

MySQL

Die folgenden Beispiele mit dem MySQL-Client zeigen zwei Möglichkeiten, wie Sie die MySQL-Verbindung eines Skripts überprüfen, um zu ermitteln, ob zum Herstellen von Verbindungen ein gültiges Zertifikat erforderlich ist. Weitere Informationen zu allen Verbindungsoptionen mit dem MySQL-Client finden Sie unter Client-Side Configuration for Encrypted Connections in der MySQL-Dokumentation.

Wenn der MySQL 5.7- oder MySQL 8.0-Client verwendet wird, erfordert eine SSL-Verbindung die Verifizierung anhand des CA-Serverzertifikats, wenn Sie für die Option --ssl-mode den Wert VERIFY_CA oder VERIFY_IDENTITY angeben wie im folgenden Beispiel gezeigt.

mysql -h mysql-database.rds.amazonaws.com -uadmin -ppassword --ssl-ca=/tmp/ssl-cert.pem --ssl-mode=VERIFY_CA

Wenn der MySQL 5.6-Client verwendet wird, erfordert eine SSL-Verbindung die Verifizierung anhand des CA-Serverzertifikats, wenn Sie die Option --ssl-verify-server-cert angeben wie im folgenden Beispiel gezeigt.

mysql -h mysql-database.rds.amazonaws.com -uadmin -ppassword --ssl-ca=/tmp/ssl-cert.pem --ssl-verify-server-cert

Aktualisieren des Trust Stores Ihrer Anwendung

Informationen zum Aktualisieren des Trust Stores für MySQL-Anwendungen finden Sie unter Installing SSL Certificates in der MySQL-Dokumentation.

Anmerkung

Wenn Sie den Trust Store aktualisieren, können Sie ältere Zertifikate beibehalten und die neuen Zertifikate einfach hinzufügen.

Aktualisieren des Trust Stores Ihrer Anwendung für JDBC

Sie können den Trust Store für Anwendungen aktualisieren, die JDBC für SSL/TLS-Verbindungen verwenden.

So aktualisieren Sie den Trust Store für JDBC-Anwendungen

  1. Laden Sie das Stammzertifikat 2019 herunter, das für alle AWS-Regionen funktioniert, und speichern Sie die Datei im Trust Store-Verzeichnis ab.

    Informationen zum Herunterladen des Stammverzeichnisses finden Sie unter Verwenden von SSL/TLS für die Verschlüsselung einer Verbindung zu einer DB-Instance.

  2. Führen Sie folgenden Befehl aus, um das Zertifikat in das DER-Format zu konvertieren.

    openssl x509 -outform der -in rds-ca-2019-root.pem -out rds-ca-2019-root.der

    Ersetzen Sie den Dateinamen durch den Namen der Datei, die Sie heruntergeladen haben.

  3. Importieren Sie das Zertifikat mit folgendem Befehl in den Schlüsselspeicher.

    keytool -import -alias rds-root -keystore clientkeystore -file rds-ca-2019-root.der
  4. Überprüfen Sie, ob der Schlüsselspeicher erfolgreich aktualisiert wurde.

    keytool -list -v -keystore clientkeystore.jks

    Geben Sie das Passwort des Schlüsselspeichers ein, wenn Sie dazu aufgefordert werden.

    Die Ausgabe sollte Folgendes enthalten:

    rds-root,date, trustedCertEntry, Certificate fingerprint (SHA1): D4:0D:DB:29:E3:75:0D:FF:A6:71:C3:14:0B:BF:5F:47:8D:1C:80:96 # This fingerprint should match the output from the below command openssl x509 -fingerprint -in rds-ca-2019-root.pem -noout

Wenn Sie den JDBC-Treiber von MySQL in einer Anwendung verwenden, legen Sie in der Anwendung die folgenden Eigenschaften fest.

System.setProperty("javax.net.ssl.trustStore", certs); System.setProperty("javax.net.ssl.trustStorePassword", "password");

Legen Sie während des Startens der Anwendung die folgenden Eigenschaften fest.

java -Djavax.net.ssl.trustStore=/path_to_truststore/MyTruststore.jks -Djavax.net.ssl.trustStorePassword=my_truststore_password com.companyName.MyApplication

Java-Beispielcode für die Herstellung von SSL-Verbindungen

Im folgenden Codebeispiel wird gezeigt, wie Sie die SSL-Verbindung einrichten, die das Serverzertifikat mithilfe von JDBC validiert.

public class MySQLSSLTest { private static final String DB_USER = "username"; private static final String DB_PASSWORD = "password"; // This key store has only the prod root ca. private static final String KEY_STORE_FILE_PATH = "file-path-to-keystore"; private static final String KEY_STORE_PASS = "keystore-password"; public static void test(String[] args) throws Exception { Class.forName("com.mysql.jdbc.Driver"); System.setProperty("javax.net.ssl.trustStore", KEY_STORE_FILE_PATH); System.setProperty("javax.net.ssl.trustStorePassword", KEY_STORE_PASS); Properties properties = new Properties(); properties.setProperty("sslMode", "VERIFY_IDENTITY"); properties.put("user", DB_USER); properties.put("password", DB_PASSWORD); Connection connection = null; Statement stmt = null; ResultSet rs = null; try { connection = DriverManager.getConnection("jdbc:mysql://mydatabase.123456789012.us-east-1.rds.amazonaws.com:3306",properties); stmt = connection.createStatement(); rs=stmt.executeQuery("SELECT 1 from dual"); } finally { if (rs != null) { try { rs.close(); } catch (SQLException e) { } } if (stmt != null) { try { stmt.close(); } catch (SQLException e) { } } if (connection != null) { try { connection.close(); } catch (SQLException e) { e.printStackTrace(); } } } return; } }
Wichtig

Wenn Sie festgestellt haben, dass Ihre Datenbankverbindungen SSL/TLS verwenden, und Sie den Trust Store Ihrer Anwendung aktualisiert haben, können Sie Ihre Datenbank für die Verwendung der rds-ca-2019-Zertifikate aktualisieren. Anweisungen hierzu finden Sie in Schritt 3 unter Aktualisieren des CA-Zertifikats durch Ändern der DB-Instance.