web-dev-qa-db-fra.com

Utilisation de Java pour établir une connexion sécurisée avec MySQL Amazon RDS (SSL/TLS)

J'essaie de me connecter en toute sécurité à Amazon RDS à l'aide de JDK 1.8 et de MySQL Connector/J version 5.1.23. Les instructions de MySQL Connector/J documentation

Les instructions disent de créer un fichier de clés certifiées dans le répertoire actuel et d'importer le certificat de l'autorité de certification du serveur. Lorsque je lance la commande ci-dessous, on me demande un mot de passe et je ne sais pas quoi entrer:

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

Les instructions de Amazon indiquent par contre que les certificats sont signés par une autorité de certification. Le certificat SSL inclut le point de terminaison de l'instance de base de données sous le nom commun (CN). La clé publique est également stockée dans http://s3.amazonaws.com/rds-downloads/rds-combined-ca-bundle.pem

Bien que je comprenne le concept de SSL/TSL et de clés privée/publique, je ne comprends pas comment le mettre en œuvre.

Lorsque je lance la commande SHOW VARIABLES LIKE 'have_ssl';, je reçois la valeur "oui". Lorsque je suis connecté à la base de données et que je lance SHOW SESSION STATUS LIKE 'Ssl_version';, je ne reçois aucune valeur.

Comment établir une connexion sécurisée de Java à une base de données MySQL?

Mise à jour: J'utilise Ubuntu et j'ai utilisé l'outil de clé pour générer un fichier truststore.jks dans le répertoire JRE /usr/lib/jvm/Java/jre/. J'ai aussi exécuté la commande suivante: GRANT USAGE ON db_name.* To 'username'@'address' REQUIRE SSL;

Le code ci-dessous indique comment je me connecte à la base de données:

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);
    }
}

Le code ci-dessus génère un message Communications link failure et The last packet successfully received from the server was 24 milliseconds ago. The last packet sent successfully to the server was 24 milliseconds ago. Je suis capable de me connecter avec succès lorsque ?verifyServerCertificate=true&useSSL=true&requireSSL=true est supprimé de l'URI et que REQUIRE SSL est supprimé des autorisations utilisateur.

Mise à jour 2: J'ai ramené le code à l'essentiel et quand j'ai exécuté le code ci-dessous:

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();
        }
    }
}

Je reçois le message d'erreur suivant:

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

J'ai également confirmé à l'aide de Workbench et du fichier .pem que l'utilisateur peut se connecter à l'aide de SSL.

Mise à jour 3: Informations de débogage après la définition de javax.net.debug sur 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  ..@/.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

Lorsque vous exécutez la commande ci-dessous et que le mot de passe vous est demandé, vous devez taper "changeit". C'est le mot de passe par défaut pour le magasin de clés

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

Ensuite, assurez-vous que l'utilisateur mysql que vous utilisez est configuré pour exiger SSL comme indiqué ci-dessous

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

Ensuite, assurez-vous que le paquetage rds que vous avez téléchargé depuis http://s3.amazonaws.com/rds-downloads/rds-combined-ca-bundle.pem est importé dans les cacerts Java par défaut du serveur d’applications. tente de se connecter à AWS RDS.

Enfin, vous devez ajouter les trois propriétés ci-dessous avec la valeur 'true' à votre URL mysql

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

Par exemple:

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

J'espère que cela t'aides!

8
virag

Le keytool Java importe un seul certificat à la fois, mais le groupe d'autorités de certification combinées RDS contient de nombreux certificats d'autorité de certification. Vous devrez importer chaque certificat de l'ensemble séparément. Lorsque vous essayez d'importer le bundle, il ne fait qu'importer un certificat, qui peut ne pas être l'autorité de certification racine sur laquelle vous devez faire confiance à l'instance RDS.

Sur Linux, vous pouvez diviser le pem avec l'outil CSPLIT:

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

Ensuite, vous devez importer chaque pem dans votre magasin de clés séparément.

5
Alec Henninger

Sur Mac OS X et FreeBSD, la procédure est similaire. Cela cassera et importera tous les certificats du fichier rds-combine-cabundle.pem. Vous devrez changer le chemin pour OS X, mais sinon, il est identique. 

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 fournit des certificats distincts et pas seulement le kit, qui contient des éléments supplémentaires dont vous n’auriez pas besoin. (Comme mentionné par d’autres, importer un grand nombre de certificats via keytool est une tâche ardue.) Voir Utilisation de SSL pour chiffrer une connexion à une instance de base de données .

Vous devrez télécharger deux certificats: le certificat racine et le certificat intermédiaire pour votre région. Comme indiqué dans le lien ci-dessus,

Un certificat racine qui fonctionne pour toutes les régions peut être téléchargé à l'adresse suivante: https://s3.amazonaws.com/rds-downloads/rds-ca-2015-root.pem .

et les certificats intermédiaires se trouvent plus bas dans la page. Vous devez utiliser celui qui convient à votre région, la région où se trouve votre instance de base de données.

Je recommande d'utiliser keytool pour importer ces deux éléments dans un nouveau magasin de clés et d'indiquer à MySQL de l'utiliser via les paramètres de connexion trustCertificateKeyStoreUrl et trustCertificateKeyStorePassword. Jouer avec le magasin de clés principal peut être un peu risqué.

1
Erica Kane