it-swarm.com.de

Verwenden von Java zum Herstellen einer sicheren Verbindung zu MySQL Amazon RDS (SSL/TLS)

Ich versuche, mit JDK 1.8 und MySQL Connector/J Version 5.1.23 eine sichere Verbindung zu Amazon RDS herzustellen, und ich bin verwirrt über die Anweisungen in MySQL Connector/J-Dokumentation

Die Anweisungen besagen, dass im aktuellen Verzeichnis ein Truststore erstellt und das CA-Zertifikat des Servers importiert werden soll. Wenn ich den folgenden Befehl ausführe, werde ich nach einem Passwort gefragt und weiß nicht, was ich eingeben soll:

keytool -import -alias mysqlServerCACert -file file_location.pem -keystore truststore

Die Anweisungen von Amazon weisen dagegen darauf hin, dass Zertifikate von einer Zertifizierungsstelle signiert werden. Das SSL-Zertifikat enthält den DB-Instanzendpunkt als Common Name (CN). Der öffentliche Schlüssel wird auch unter http://s3.amazonaws.com/rds-downloads/rds-combined-ca-bundle.pem gespeichert. 

Während ich das Konzept von SSL/TSL und privaten/öffentlichen Schlüsseln verstehe, bin ich verwirrt, wie ich dies implementieren kann.

Wenn ich den Befehl SHOW VARIABLES LIKE 'have_ssl'; ausführe, erhalte ich als Wert "yes". Wenn ich mit der Datenbank verbunden bin und SHOW SESSION STATUS LIKE 'Ssl_version'; starte, erhalte ich keinen Wert zurück.

Wie stellen Sie eine sichere Verbindung von Java zu einer MySQL-Datenbank her?

Update: Ich verwende Ubuntu und benutzte das Keytool, um eine truststore.jks-Datei im JRE-Verzeichnis /usr/lib/jvm/Java/jre/ zu generieren. Ich habe auch den folgenden Befehl ausgeführt: GRANT USAGE ON db_name.* To 'username'@'address' REQUIRE SSL;

Der folgende Code ist, wie ich mich mit der Datenbank verbinde:

import com.mysql.jdbc.Connection;

public class mainClass{

    public static void main(String[] args){

        System.setProperty("javax.net.ssl.trustStore", "/usr/lib/jvm/Java/jre/truststore.jks");
        System.setProperty("javax.net.ssl.trustStorePassword", "truststore_password");

        final String url = "jdbc:mysql://mysql_rds_enpoint:port/db_name?verifyServerCertificate=true&useSSL=true&requireSSL=true";
        final String username = "username";
        final String password = "password";

        Connection mysqlConnection = null;
        mysqlConnection = (Connection) mysqlMethods.connectToMysql(url, username, password);
    }
}

Der obige Code erzeugt eine Communications link failure-Nachricht und The last packet successfully received from the server was 24 milliseconds ago. The last packet sent successfully to the server was 24 milliseconds ago. Ich kann erfolgreich eine Verbindung herstellen, wenn ?verifyServerCertificate=true&useSSL=true&requireSSL=true aus dem URI entfernt wird und REQUIRE SSL aus den Benutzerberechtigungen entfernt wird.

Update 2: Ich habe den Code auf die Grundlagen zurückgeführt und wenn ich den folgenden Code ausführe:

import Java.sql.DriverManager;
import Java.sql.SQLException;

class testClass{

    public static void main(String[] args){
        System.setProperty("javax.net.ssl.trustStore", "/usr/lib/jvm/Java/jre/truststore.jks");
        System.setProperty("javax.net.ssl.trustStorePassword", "truststore_password");

        final String url = "jdbc:mysql://mysql_rds_enpoint:port/db_name?verifyServerCertificate=true&useSSL=true&requireSSL=true";
        final String username = "username";
        final String password = "password";

        try {
            Object connection = DriverManager.getConnection(url, username, password);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

Ich erhalte folgende Fehlermeldung:

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

The last packet successfully received from the server was 206 milliseconds ago.  The last packet sent successfully to the server was 203 milliseconds ago.
    at Sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at Sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.Java:62)
    at Sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.Java:45)
    at Java.lang.reflect.Constructor.newInstance(Constructor.Java:422)
    at com.mysql.jdbc.Util.handleNewInstance(Util.Java:389)
    at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.Java:1038)
    at com.mysql.jdbc.ExportControlled.transformSocketToSSLSocket(ExportControlled.Java:110)
    at com.mysql.jdbc.MysqlIO.negotiateSSLConnection(MysqlIO.Java:4760)
    at com.mysql.jdbc.MysqlIO.proceedHandshakeWithPluggableAuthentication(MysqlIO.Java:1629)
    at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.Java:1206)
    at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.Java:2239)
    at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.Java:2270)
    at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.Java:2069)
    at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.Java:794)
    at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.Java:44)
    at Sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at Sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.Java:62)
    at Sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.Java:45)
    at Java.lang.reflect.Constructor.newInstance(Constructor.Java:422)
    at com.mysql.jdbc.Util.handleNewInstance(Util.Java:389)
    at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.Java:399)
    at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.Java:325)
    at Java.sql.DriverManager.getConnection(DriverManager.Java:664)
    at Java.sql.DriverManager.getConnection(DriverManager.Java:247)
    at apples.main(mainClass.Java:18)

Caused by: javax.net.ssl.SSLException: Java.lang.RuntimeException: Unexpected error: Java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty
    at Sun.security.ssl.Alerts.getSSLException(Alerts.Java:208)
    at Sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.Java:1949)
    at Sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.Java:1906)
    at Sun.security.ssl.SSLSocketImpl.handleException(SSLSocketImpl.Java:1889)
    at Sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.Java:1410)
    at Sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.Java:1387)
    at com.mysql.jdbc.ExportControlled.transformSocketToSSLSocket(ExportControlled.Java:95)
    ... 18 more

Caused by: Java.lang.RuntimeException: Unexpected error: Java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty
    at Sun.security.validator.PKIXValidator.<init>(PKIXValidator.Java:90)
    at Sun.security.validator.Validator.getInstance(Validator.Java:179)
    at Sun.security.ssl.X509TrustManagerImpl.getValidator(X509TrustManagerImpl.Java:312)
    at Sun.security.ssl.X509TrustManagerImpl.checkTrustedInit(X509TrustManagerImpl.Java:171)
    at Sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.Java:184)
    at Sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.Java:124)
    at Sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.Java:1488)
    at Sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.Java:216)
    at Sun.security.ssl.Handshaker.processLoop(Handshaker.Java:979)
    at Sun.security.ssl.Handshaker.process_record(Handshaker.Java:914)
    at Sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.Java:1062)
    at Sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.Java:1375)
    at Sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.Java:1403)
    ... 20 more

Caused by: Java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty
    at Java.security.cert.PKIXParameters.setTrustAnchors(PKIXParameters.Java:200)
    at Java.security.cert.PKIXParameters.<init>(PKIXParameters.Java:120)
    at Java.security.cert.PKIXBuilderParameters.<init>(PKIXBuilderParameters.Java:104)
    at Sun.security.validator.PKIXValidator.<init>(PKIXValidator.Java:88)
    ... 32 more

Ich habe auch mithilfe von Workbench und der PEM-Datei bestätigt, dass sich der Benutzer mit SSL anmelden kann.

Update 3: Debug Info nach dem Setzen von javax.net.debug auf ssl:

keyStore is : 
keyStore type is : jks
keyStore provider is : 
init keystore
init keymanager of type SunX509
trustStore is: /usr/lib/jvm/Java/jre/truststore.jks
trustStore type is : jks
trustStore provider is : 
init truststore
adding as trusted cert:
  Subject: CN=aws.Amazon.com/rds/, OU=RDS, O=Amazon.com, L=Seattle, ST=Washington, C=US
  Issuer:  CN=aws.Amazon.com/rds/, OU=RDS, O=Amazon.com, L=Seattle, ST=Washington, C=US
  Algorithm: RSA; Serial number: 0xe775b657e21a8128
  Valid from Tue Apr 06 08:44:31 AEST 2010 until Sun Apr 05 08:44:31 AEST 2015

trigger seeding of SecureRandom
done seeding SecureRandom
Ignoring unavailable cipher suite: TLS_DHE_DSS_WITH_AES_256_GCM_SHA384
Ignoring unavailable cipher suite: TLS_RSA_WITH_AES_256_CBC_SHA
Ignoring unavailable cipher suite: TLS_DHE_RSA_WITH_AES_256_GCM_SHA384
Ignoring unavailable cipher suite: TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA
Ignoring unavailable cipher suite: TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
Ignoring unavailable cipher suite: TLS_RSA_WITH_AES_256_CBC_SHA256
Ignoring unavailable cipher suite: TLS_DHE_DSS_WITH_AES_256_CBC_SHA
Ignoring unavailable cipher suite: TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384
Ignoring unavailable cipher suite: TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384
Ignoring unavailable cipher suite: TLS_RSA_WITH_AES_256_GCM_SHA384
Ignoring unavailable cipher suite: TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384
Ignoring unavailable cipher suite: TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
Ignoring unavailable cipher suite: TLS_ECDH_RSA_WITH_AES_256_CBC_SHA
Ignoring unavailable cipher suite: TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384
Ignoring unavailable cipher suite: TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
Ignoring unavailable cipher suite: TLS_DHE_RSA_WITH_AES_256_CBC_SHA256
Ignoring unavailable cipher suite: TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
Ignoring unavailable cipher suite: TLS_DHE_DSS_WITH_AES_256_CBC_SHA256
Ignoring unavailable cipher suite: TLS_DHE_RSA_WITH_AES_256_CBC_SHA
Ignoring unavailable cipher suite: TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
Ignoring unavailable cipher suite: TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
Allow unsafe renegotiation: false
Allow legacy hello messages: true
Is initial handshake: true
Is secure renegotiation: false
Ignoring unsupported cipher suite: TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 for TLSv1
Ignoring unsupported cipher suite: TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 for TLSv1
Ignoring unsupported cipher suite: TLS_RSA_WITH_AES_128_CBC_SHA256 for TLSv1
Ignoring unsupported cipher suite: TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256 for TLSv1
Ignoring unsupported cipher suite: TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256 for TLSv1
Ignoring unsupported cipher suite: TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 for TLSv1
Ignoring unsupported cipher suite: TLS_DHE_DSS_WITH_AES_128_CBC_SHA256 for TLSv1
Ignoring unsupported cipher suite: TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
Ignoring unsupported cipher suite: TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
Ignoring unsupported cipher suite: TLS_RSA_WITH_AES_128_CBC_SHA256
Ignoring unsupported cipher suite: TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256
Ignoring unsupported cipher suite: TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256
Ignoring unsupported cipher suite: TLS_DHE_RSA_WITH_AES_128_CBC_SHA256
Ignoring unsupported cipher suite: TLS_DHE_DSS_WITH_AES_128_CBC_SHA256
Ignoring unsupported cipher suite: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
Ignoring unsupported cipher suite: TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
Ignoring unsupported cipher suite: TLS_RSA_WITH_AES_128_GCM_SHA256
Ignoring unsupported cipher suite: TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256
Ignoring unsupported cipher suite: TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256
Ignoring unsupported cipher suite: TLS_DHE_RSA_WITH_AES_128_GCM_SHA256
Ignoring unsupported cipher suite: TLS_DHE_DSS_WITH_AES_128_GCM_SHA256
%% No cached client session
*** ClientHello, TLSv1
RandomCookie:  GMT: 1425012760 bytes = { 250, 182, 202, 168, 139, 248, 125, 121, 251, 188, 182, 110, 1, 234, 29, 105, 158, 219, 212, 122, 105, 57, 87, 80, 44, 141, 121, 154 }
Session ID:  {}
Cipher Suites: [TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, TLS_RSA_WITH_AES_128_CBC_SHA, TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA, TLS_ECDH_RSA_WITH_AES_128_CBC_SHA, TLS_DHE_RSA_WITH_AES_128_CBC_SHA, TLS_DHE_DSS_WITH_AES_128_CBC_SHA, TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA, TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA, SSL_RSA_WITH_3DES_EDE_CBC_SHA, TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA, TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA, SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA, SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA, TLS_EMPTY_RENEGOTIATION_INFO_SCSV]
Compression Methods:  { 0 }
Extension elliptic_curves, curve names: {secp256r1, sect163k1, sect163r2, secp192r1, secp224r1, sect233k1, sect233r1, sect283k1, sect283r1, secp384r1, sect409k1, sect409r1, secp521r1, sect571k1, sect571r1, secp160k1, secp160r1, secp160r2, sect163r1, secp192k1, sect193r1, sect193r2, secp224k1, sect239k1, secp256k1}
Extension ec_point_formats, formats: [uncompressed]
Extension server_name, server_name: [type=Host_name (0), value=abcd.abcd123.ap-southeast-1.rds.amazonaws.com]
***
main, WRITE: TLSv1 Handshake, length = 202
main, READ: TLSv1 Handshake, length = 74
*** ServerHello, TLSv1
RandomCookie:  GMT: -1571637097 bytes = { 78, 228, 80, 30, 162, 233, 208, 59, 196, 166, 88, 129, 155, 99, 123, 252, 123, 153, 129, 25, 144, 235, 185, 112, 68, 79, 2, 79 }
Session ID:  {104, 7, 155, 31, 238, 102, 222, 218, 193, 219, 108, 206, 57, 235, 53, 253, 1, 200, 64, 46, 92, 60, 63, 251, 142, 106, 233, 54, 27, 110, 79, 128}
Cipher Suite: TLS_RSA_WITH_AES_128_CBC_SHA
Compression Method: 0
***
Warning: No renegotiation indication extension in ServerHello
%% Initialized:  [Session-1, TLS_RSA_WITH_AES_128_CBC_SHA]
** TLS_RSA_WITH_AES_128_CBC_SHA
main, READ: TLSv1 Handshake, length = 1057
*** Certificate chain
chain [0] = [
[
  Version: V3
  Subject: C=US, ST=Washington, L=Seattle, O=Amazon.com, OU=RDS, CN=sifrmedium.cove4uttgoa2.ap-southeast-2.rds.amazonaws.com
  Signature Algorithm: SHA1withRSA, OID = 1.2.840.113549.1.1.5

  Key:  Sun RSA public key, 1024 bits
  modulus: 7182371456073335432842458631460148573771628715802835656528548198324749485547005738326606223242830258829871966755842342342342344059076665280539770508892924695580383343581127930380098999434723444448883595421930164673020286553920728427
  public exponent: 65537
  Validity: [From: Sun Jun 21 11:55:57 AEST 2015,
               To: Fri Mar 06 09:03:24 AEDT 2020]
  Issuer: CN=Amazon RDS ap-southeast-2 CA, OU=Amazon RDS, O="Amazon Web Services, Inc.", L=Seattle, ST=Washington, C=US
  SerialNumber: [    810c7b2c 621bcf07 366cad3b ab405b]

Certificate Extensions: 2
[1]: ObjectId: 2.5.29.35 Criticality=false
AuthorityKeyIdentifier [
KeyIdentifier [
0000: 89 50 9D 8D 0A 1D 42 A7   D6 36 2E 99 27 44 61 FC  .P.......6..'Ia.
0010: 23 FC D7 F0                                        #...
]
[CN=Amazon RDS Root CA, OU=Amazon RDS, O="Amazon Web Services, Inc.", L=Seattle, ST=Washington, C=US]
SerialNumber: [    46]
]

[2]: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: 0C 5C 64 D5 CE C4 27 13   34 01 A0 0D 64 8C B1 C9  .\d...'.4...d<..
0010: 4D 6C 3D 16                                        M\=.
]
]

]
  Algorithm: [SHA1withRSA]
  Signature:
0000: 16 53 AA 7A 55 49 84 87   5C EC 49 B9 BD 51 98 83  .S.zUI..\.I..Q..
0010: BA 91 84 72 29 77 19 6C   F7 CA 0A 36 09 AC 70 F4  ...r)w.l...6..p.
0020: 8A 2C 90 FD 36 3D 3D CD   E9 BA 2C 5C 95 C3 79 78  .,..6==...,\..yx
0030: CE FA 46 A0 3D 77 31 11   E3 5B 9C 84 AF 4D 60 51  ..F.=w1..[...M`Q
0040: 80 52 04 1E 65 4D 6E 5B   92 E1 69 79 12 8E 56 0F  .R..eMn[..iy..V.
0050: 83 E4 F8 31 4E A7 65 4E   C2 BB 97 A8 B4 67 79 F4  ...1N.eN.....gy.
0060: CD 37 F7 00 A5 42 B9 E0   CB D9 CA 81 EC E3 A3 E3  .7...B..........
0070: FB 05 40 2F 9A 4B 5D AE   7C 30 F4 BA ED DC 74 AC  [email protected]/.K]..0....t.
0080: 89 30 AD 13 26 F7 88 09   66 01 E1 4B 3A 8C B1 3D  .0..&...f..K:..=
0090: 28 6F 74 1D B0 00 25 FB   9B 1E 00 8D F1 1F 83 84  (ot...%.........
00A0: CE D7 92 39 78 C4 70 26   8E 3C 05 1C 10 3C A3 E0  ...9x.p&.<...<..
00B0: CC 30 F0 A0 68 B1 26 C4   23 AC C0 C6 8A 27 DB 3C  .0..h.&.#....'.<
00C0: 7F 38 DD EE 92 1B A3 A4   99 13 9F 80 62 66 C8 F0  .8..........bf..
00D0: 46 25 38 C3 99 0A A2 A7   04 E5 FF 4D 31 2B E4 82  F%8........M1+..
00E0: BE D9 D5 07 28 96 17 07   30 B9 EC BA 26 F3 7B C3  ....(...0...&...
00F0: 1A CF 13 73 58 96 F2 87   3F FD 86 09 35 FA A3 7B  ...sX...?...5...

]
***
%% Invalidated:  [Session-1, TLS_RSA_WITH_AES_128_CBC_SHA]
main, SEND TLSv1 ALERT:  fatal, description = certificate_unknown
main, WRITE: TLSv1 Alert, length = 2
main, called closeSocket()
main, handling exception: javax.net.ssl.SSLHandshakeException: Sun.security.validator.ValidatorException: PKIX path building failed: Sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
main, called close()
main, called closeInternal(true)
13
Greg

Wenn Sie den folgenden Befehl ausführen und nach dem Kennwort gefragt werden, geben Sie "changeit" ein. Dies ist das Standardkennwort für den Schlüsselspeicher

keytool -import -alias mysqlServerCACert -file file_location.pem -keystore truststore

Stellen Sie als Nächstes sicher, dass der von Ihnen verwendete mysql-Benutzer so konfiguriert ist, dass SSL erforderlich ist (siehe unten)

GRANT ALL PRIVILEGES ON test.* TO 'root'@'localhost' REQUIRE SSL;

Stellen Sie als Nächstes sicher, dass das rds-Paket, das Sie von http://s3.amazonaws.com/rds-downloads/rds-combined-ca-bundle.pem heruntergeladen haben, auf den Standard-Java-Zertifikaten des App-Servers importiert wird versucht, eine Verbindung zum AWS RDS herzustellen.

Als letztes müssen Sie die drei Eigenschaften mit dem Wert 'true' an Ihre mysql-URL anhängen

?verifyServerCertificate=true&useSSL=true&requireSSL=true

Z.B:

final String url = "jdbc:mysql://mysql_rds_enpoint:port/db_name?verifyServerCertificate=true&useSSL=true&requireSSL=true";

Hoffe das hilft!

8
virag

Java-Keytool importiert jeweils nur ein Zertifikat, aber das kombinierte RDS-CA-Paket verfügt über viele CA-Zertifikate. Sie müssen jedes Zertifikat im Bundle separat importieren. Wenn Sie versuchen, das Bundle zu importieren, wird nur ein Zertifikat importiert, bei dem es sich möglicherweise nicht um die Stammzertifizierungsstelle handelt, die Sie der RDS-Instanz als vertrauenswürdig erklären müssen.

Unter Linux können Sie das Pem mit dem CSPLIT-Tool teilen:

csplit -b %02d.pem -z rds-combined-ca-bundle.pem /-----BEGIN/ {*}

Dann müssen Sie jedes Pem separat in Ihren Schlüsselspeicher importieren.

5
Alec Henninger

Unter Mac OS X und FreeBSD ist die Vorgehensweise ähnlich. Dadurch werden alle Zertifikate aus der Datei rds-combined-cabundle.pem aufgelöst und importiert. Sie müssen den Pfad für OS X ändern, ansonsten ist er jedoch identisch. 

split -p "-----BEGIN CERTIFICATE-----" rds-combined-ca-bundle.pem individual-

find . -iname 'individual*' -exec keytool -import -file {} -alias {} -storepass changeit -keystore /usr/local/openjdk8/jre/lib/security/cacerts \;
3
Lucas Holt

AWS stellt separate Zertifikate zur Verfügung und nicht nur das Bundle, für das Sie nicht mehr benötigen. (Wie bereits erwähnt, ist das Importieren einer großen Anzahl von Zertifikaten über keytool ein Problem.) Siehe SSL zum Verschlüsseln einer Verbindung zu einer DB-Instanz verwenden.

Sie müssen zwei Zertifikate herunterladen: das Stammzertifikat und das Zwischenzertifikat für Ihre Region. Wie im obigen Link angegeben,

Ein Stammzertifikat, das für alle Regionen geeignet ist, kann unter https://s3.amazonaws.com/rds-downloads/rds-ca-2015-root.pem heruntergeladen werden.

die Zwischenzertifikate finden Sie weiter unten auf der Seite. Sie müssen den für Ihre Region geeigneten verwenden, die Region, in der sich Ihre Datenbankinstanz befindet.

Ich empfehle, keytool zu verwenden, um beide in einen neuen Keystore zu importieren, und MySQL muss diesen Keystore über die Verbindungsparameter trustCertificateKeyStoreUrl und trustCertificateKeyStorePassword verwenden. Ein Spiel mit dem Hauptschlüsselspeicher kann ein bisschen riskant sein.

1
Erica Kane