MySQL JDBC强制忽略AWS RDS上的客户端证书

我有一个在AWS上运行的Java Web应用程序,并连接到在AWS RDS上运行的MySQL数据库。

我的应用程序使用由我们自己的CA签署的SSL客户端证书连接到各种Web服务,所以我已经设置了-Djavax.net.ssl.keyStore-Djavax.net.ssl.trustStore系统属性。

我已经将https://s3.amazonaws.com/rds-downloads/rds-combined-ca-bundle.pem证书添加到我的trustStore ,并且可以通过命令行客户端使用SSL连接到MySQL。

我的MySQL连接string如下所示:

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

我正在使用mysql:mysql-connector-java:jar:5.1.38来运行JBDC连接。

我发现当我设置trustStore时,我的Java应用程序可以将OK连接到MySQL,但在设置keyStoretrustStore时失败:

 ! 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 

看来Java正在向MySQL提交我的私有CA签名的客户端证书,这是拒绝它的。 我已经捕获了使用tcpdump的交互,并且我的客户端证书的DN正被发送到MySQL。

我怎样才能使用我的客户端证书HTTPS连接,但不使用它的MySQL连接?

我已经尝试创build一个空的密钥库,并设置我的连接string来使用它:

 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 

这给了我以下错误:

 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) 

  • 为SSLconfigurationMySQL,但SSL仍然处于禁用状态。
  • 有许多SSL子域 - 最佳实践?
  • 如何检查我的SSL证书是否已被吊销?
  • SVN边缘不与域控制器正确validation
  • 如何禁用组时禁用某些SSL密码?
  • SSL证书的CSR和密钥文件生成在哪里?
  • One Solution collect form web for “MySQL JDBC强制忽略AWS RDS上的客户端证书”

    您可以强制MySQL通过在连接URL中设置一个空的密钥库来使用任何客户端证书。

    我上面的问题是https://bugs.mysql.com/bug.php?id=36948的变种 – 如果您在连接URL中设置“clientCertificateKeyStoreUrl”,而不是“trustCertificateKeyStoreUrl”(和其他4个参数下面),那么MySQL将崩溃与“TrustManagerFactoryImpl未初始化”,而不是一个更有帮助的错误。

    您可以使用如下命令创build一个空的密钥库:

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

    然后用如下的URL连接到MySQL:

     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 

    所有6个keystore参数都是必需的,即使您需要默认值,否则您将看到“TrustManagerFactoryImpl未初始化”错误

    服务器问题集锦,包括 Linux(Ubuntu, Centos,Debian等)和Windows Server服务器.