MySQL JDBC Ignore de force le certificat client sur AWS RDS

J'ai une application web Java, Travaille sur AWS et connecté à la base de données MySQL, Travaille sur AWS RDS.

Mon application utilise des certificats clients SSL, signé par notre propre autorité de certification pour la connexion à divers services Web, donc j'ai installé

-Djavax.net.ssl.keyStore

et

-Djavax.net.ssl.trustStore

propriétés du système.

J'ai ajouté

[url=https://s3.amazonaws.com/rds-downloads/rds-combined-ca-bundle.pem]https://s3.amazonaws.com/rds-d ... e.pem[/url]

Certificats pour les miens

trustStore

, Et je peux normalement se connecter à MySQL, Utilisant SSL Via le client de ligne de commande.

Ma ligne de ligne à MySQL Ressemble à ça:

jdbc:mysql://my-server-id.eu-west-1.rds.amazonaws.com/my-database?verifyServerCertificate=true&useSSL=true&requireSSL=true

j'utilise

mysql:mysql-connector-java:jar:5.1.38

Pour démarrer la connexion JBDC.

J'ai découvert ma demande Java peut normalement se connecter à MySQL, Quand j'installe

trustStore

, Mais il échoue quand j'installe

keyStore

et

trustStore

:

! javax.net.ssl.SSLException: Unsupported record version Unknown-0.0
! at sun.security.ssl.InputRecord.checkRecordVersion(InputRecord.java:552) ~[na:1.8.0_91]
! at sun.security.ssl.InputRecord.readV3Record(InputRecord.java:565) ~[na:1.8.0_91]
! at sun.security.ssl.InputRecord.read(InputRecord.java:532) ~[na:1.8.0_91]
! at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:973) ~[na:1.8.0_91]
! at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1375) ~[na:1.8.0_91]
! at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1403) ~[na:1.8.0_91]
! at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1387) ~[na:1.8.0_91]
! at com.mysql.jdbc.ExportControlled.transformSocketToSSLSocket(ExportControlled.java:149) ~[user-portal-web-0.0.1.jar:0.0.1]
! ... 40 common frames omitted

Il paraît que Java représente mon certificat client signé par privé CA, MySQL, qui le rejette. J'ai enregistré une interaction en utilisant

tcpdump

, et DN Mon certificat client est envoyé à MySQL.

Comment puis-je utiliser mon certificat client pour les connexions HTTPS, mais ne l'utilisez pas pour les connexions MySQL?

J'ai essayé de créer une clé de clés vide et de le configurer dans la ligne de connexion:

jdbc:mysql://my-server-id.eu-west-1.rds.amazonaws.com/my-database?verifyServerCertificate=true&useSSL=true&requireSSL=true&clientCertificateKeyStoreUrl=file:nokeys.jks&clientCertificateKeyStorePassword=changeit

Cela me donne l'erreur suivante:

java.lang.IllegalStateException: TrustManagerFactoryImpl is not initialized
at sun.security.ssl.TrustManagerFactoryImpl.engineGetTrustManagers(TrustManagerFactoryImpl.java:100)
at javax.net.ssl.TrustManagerFactory.getTrustManagers(TrustManagerFactory.java:285)
at com.mysql.jdbc.ExportControlled.getSSLSocketFactoryDefaultOrConfigured(ExportControlled.java:323)
at com.mysql.jdbc.ExportControlled.transformSocketToSSLSocket(ExportControlled.java:85)
Invité:

Babette

Confirmation de:

Tu peux faire MySQL N'utilisez pas le certificat client en définissant un magasin de clé vide dans l'URL de la connexion.

Le problème avec lequel j'ai rencontré ci-dessus était une option
https://bugs.mysql.com/bug.php?id=36948
- Si vous installez «clientCertificateKeyStoreUrl» Dans la connexion URL, mais ne pas installer «trustCertificateKeyStoreUrl» (et 4 Autres paramètres ci-dessous), alors MySQL échoue avec un message «TrustManagerFactoryImpl Non initialisé »au lieu d'une erreur plus utile.

Vous pouvez créer un magasin de clé vide avec une telle commande:

keytool -genkey -alias foo -keystore empty.jks # (set password "changeit")
keytool -delete -alias foo -keystore empty.jks

Puis connectez-vous à K. MySQL Avec l'URL, par exemple:

jdbc:mysql://my-server-id.rds.amazonaws.com/my-database?verifyServerCertificate=true&useSSL=true&requireSSL=true&clientCertificateKeyStoreUrl=file:empty.jks&clientCertificateKeyStorePassword=changeit&clientCertificateKeyStoreType=JKS&trustCertificateKeyStoreUrl=file:/etc/pki/cosmos/current/client.jks&trustCertificateKeyStoreType=JKS&trustCertificateKeyStorePassword=changeit

Tout 6 Les arguments du référentiel des clés sont obligatoires, même si vous souhaitez utiliser des valeurs par défaut, sinon vous verrez une erreur «TrustManagerFactoryImpl non initialisé "

Pour répondre aux questions, connectez-vous ou registre