JDBC 到 mysql 5.7.21 和 java 1.8.0_162 ;不支持的记录版本 Unknown-0.0

Posted

技术标签:

【中文标题】JDBC 到 mysql 5.7.21 和 java 1.8.0_162 ;不支持的记录版本 Unknown-0.0【英文标题】:JDBC to mysql 5.7.21 with java 1.8.0_162 ; Unsupported record version Unknown-0.0 【发布时间】:2018-08-03 12:20:30 【问题描述】:

我正在尝试使用 JDBC 连接到 mysql。 我在 Windows 10 上生成的密钥如下:

winpty openssl pkcs12 -export -inkey ssl_cert/client-key.pem -in ssl_cert/client-cert.pem -out client.packet

keytool -importkeystore -deststorepass <password> -destkeypass <password> -destkeystore mysqldb.jks -srckeystore client.packet -srcstoretype PKCS12 -srcstorepass <password> -alias 1 

keytool -importcert -alias mysqlCA -trustcacerts -file ssl_cert/ca.pem -keystore mysqldb.jks 

我的 JDBC 代码如下所示:

System.setProperty("javax.net.ssl.trustStore", "ks-production-mysqldb.jks");
            System.setProperty("javax.net.ssl.trustStorePassword", "<password> ");
            System.setProperty("javax.net.ssl.trustStoreType", "JKS");

            System.setProperty("javax.net.ssl.keyStore", "mysqldb.jks");
            System.setProperty("javax.net.ssl.keyStorePassword", "<password> ");
            System.setProperty("javax.net.ssl.keyStoreType", "JKS");

            String dbURL = "jdbc:mysql://localhost:1234/sb?"
            + "verifyServerCertificate=true&useSSL=true&requireSSL=true";
conn = DriverManager.getConnection(dbURL, dbUser, dbPass);

我收到以下错误:

原因:javax.net.ssl.SSLException:不支持的记录版本 未知-0.0 在 sun.security.ssl.InputRecord.checkRecordVersion(InputRecord.java:552) 在 sun.security.ssl.InputRecord.readV3Record(InputRecord.java:565) 在 sun.security.ssl.InputRecord.read(InputRecord.java:529) 在 sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:983) 在 sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1385) 在 sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1413) 在 sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1397) 在 org.mariadb.jdbc.internal.mysql.MySQLProtocol.connect(MySQLProtocol.java:444) ... 7 更多

我对此进行了谷歌搜索,发现这可能是由于服务器和 java 之间的 SSL 协议不同,他们说这必须在 java 7 或更高版本中解决。 但我仍然收到错误?我错过了什么?

连接到 localhost:1234 之前的端口转发:

try 
        JSch jsch = new JSch();
        jsch.addIdentity(privateKey);
        logger.info("Establishing connection to " + sshHost + " by user " + sshUser);
        session = jsch.getSession(sshUser, sshHost, 22);
        java.util.Properties config = new java.util.Properties();
        config.put("StrictHostKeyChecking", "no");
        session.setConfig(config);
        session.connect();
        int assignedPort = session.setPortForwardingL(localPort, remoteHost, remotePort);
        logger.info("assigned Port = " + assignedPort);
     catch (JSchException e) 
        e.printStackTrace();
        throw new RuntimeException(e);
    
    return session;

openssl 命令输出:

 $ openssl s_client -connect localhost:1234
CONNECTED(00000003)
140108247099296:error:140790E5:SSL routines:ssl23_write:ssl handshake failure:s23_lib.c:177:
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 0 bytes and written 289 bytes
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
    Protocol  : TLSv1.2
    Cipher    : 0000
    Session-ID:
    Session-ID-ctx:
    Master-Key:
    Key-Arg   : None
    Krb5 Principal: None
    PSK identity: None
    PSK identity hint: None
    Start Time: 1519473350
    Timeout   : 300 (sec)
    Verify return code: 0 (ok)
---

【问题讨论】:

您确定 MySQL 正在侦听端口 1234 并激活 SSL 吗?使用 openssl 命令 (openssl s_client -connect localhost:1234) 测试此服务器以查看是否正在发生握手。 我忘了说我在尝试建立 JDBC 连接之前已经进行了端口转发。端口转发工作正常,因为我能够在没有使用相同代码强加 SSL 时连接到 db。 你没有测试我建议的命令。 我猜您正在通过 SSH 软件 JSCH 转发“清除”流量,并且您在 localhost 中,从我在 dbURL 中看到的内容来看。你相信这会通过某种魔法把它变成 SSL 吗?从我的第一条评论开始,我真的怀疑你有 SSL MySQL 监听。 是的,很抱歉我无法测试您的命令,因为在检查您的回答之前 SSL 已被禁用。但是,当我运行命令时,出现以下错误:(命令输出已添加到问题摘要中)您能否进一步解释您之前的评论。 【参考方案1】:

没有发布解决方案,因此对于面临此问题的任何人:

我们使用MariaDB一直面临这个问题,在尝试了所有方法之后,将mariaDB java客户端驱动程序版本升级到最新版本解决了这个问题。希望对您有所帮助。

【讨论】:

【参考方案2】:

至少升级到 JDK 8 u181。它适用于显示相同错误的 ReST 连接。

【讨论】:

以上是关于JDBC 到 mysql 5.7.21 和 java 1.8.0_162 ;不支持的记录版本 Unknown-0.0的主要内容,如果未能解决你的问题,请参考以下文章

Mysql 5.7.21单机多实例安装

Mysql-5.7.21安装配置

Fpm 之 Mysql-5.7.21 rpm 包制作

MySQL5.7.21安装及配置

WIN 10下Mysql 5.7.21解压缩(免安装版)配置

mysql-5.7.21-winx64安装过程