JDBC для mysql 5.7.21 с java 1.8.0_162; Неподдерживаемая версия записи Unknown-0.0

Я пытаюсь подключиться к mysql с помощью JDBC. Я сгенерировал ключи в своей 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: неподдерживаемая версия записи Unknown-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.performInitialHandshakeImpl.jSocket 1385) на sun.security.ssl.SSLSocketImpl.startHandshake (SSLSocketImpl.java:1413) на sun.security.ssl.SSLSocketImpl.startHandshake (SSLSocketImpl.java:1397) на org.mariadb.jdbc.internal.Mysq (MySQLProtocol.java:444) ... еще 7

Я искал это в Google и выяснил, что это может быть связано с различием в протоколе SSL между сервером и java, который, по их словам, должен был быть решен для 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)
---

person vikas    schedule 23.02.2018    source источник
comment
Вы уверены, что MySQL прослушивает порт 1234 с активированным SSL? Проверьте этот сервер с помощью команды openssl (openssl s_client -connect localhost: 1234), чтобы увидеть, происходит ли рукопожатие.   -  person Eugène Adell    schedule 23.02.2018
comment
Я забыл упомянуть, что перед установкой соединения JDBC я выполнил перенаправление портов. Переадресация портов работает нормально, так как я мог подключиться к базе данных раньше, когда SSL не применялся с использованием того же кода.   -  person vikas    schedule 23.02.2018
comment
Вы не тестировали команду, которую я предложил.   -  person Eugène Adell    schedule 23.02.2018
comment
Я предполагаю, что вы пересылаете чистый трафик через JSCH, который является программным обеспечением SSH, и вы находитесь на локальном хосте из того, что я вижу в dbURL. И вы верите, что это каким-то волшебным образом превратит его в SSL? Судя по моему первому комментарию, я действительно сомневаюсь, что вы слушаете SSL MySQL.   -  person Eugène Adell    schedule 23.02.2018
comment
Да, извините, я не смог проверить вашу команду, так как SSL был отключен, прежде чем я проверил ваш ответ. Однако, когда я запускаю команду, я получаю следующую ошибку: (Вывод команды добавляется в сводку вопроса) Также не могли бы вы подробнее объяснить свой предыдущий комментарий.   -  person vikas    schedule 24.02.2018
comment
Между клиентом Java, использующим драйвер JDBC, и базой данных MySQL переадресация портов не требуется. Особенно на локальном хосте. У меня вопрос: почему вы используете переадресацию портов вместо обычного прямого подключения?   -  person Eugène Adell    schedule 24.02.2018
comment
Как SSLException, так и вывод openssl показывают, что вы не разговариваете с сервером с поддержкой SSL. На данный момент у вас нет проблем с программированием (хотя для verifyServerCertificate можно установить значение false, чтобы гарантировать, что он будет работать в любом случае), у вас проблема с конфигурацией.   -  person Eugène Adell    schedule 24.02.2018
comment
Мне пришлось перенаправить порт, поскольку мой сервер БД находится в облаке (Openstak), и я не могу напрямую подключиться к нему. Способ подключения к любому экземпляру в облаке - через узел перехода Openstack, который предоставил общедоступный IP-адрес для подключения. Таким образом, можно было подключиться через переадресацию портов. Итак, я сделал ssh для хоста перехода Openstack и перенаправил порт 1234 на порт mysql. Таким образом, любой запрос, который я делаю на localhost (хост перехода): 1234, направляется в mysql.   -  person vikas    schedule 27.02.2018
comment
почему вы используете JSCH, который известен своими многочисленными ошибками, вместо более надежного клиента SSH (openssh в Linux, putty в Windows)?   -  person Eugène Adell    schedule 02.03.2018


Ответы (2)


Решение не опубликовано, поэтому для тех, кто сталкивается с этой проблемой:

Мы используем MariaDB и столкнулись с этой проблемой, попробовав все, обновив версию драйвера java-клиента mariaDB до последней версии, решившей проблему. Надеюсь, это поможет.

person A Baldino    schedule 12.07.2018

Обновите JDK 8 как минимум до u181. У меня это работает для соединения ReST, показывающего ту же ошибку.

person Florian    schedule 08.02.2021