Я не могу подключиться к БД с помощью SSH-туннеля с помощью Java. - PullRequest
0 голосов
/ 01 ноября 2018

У меня есть sql-BD с ssh-туннелем. я хочу подключиться к этому BD используя Java

код, который я использую:

    Connection con = null;
    JSch jsch = new JSch();

    int localPort = 1234;

    Session session = jsch.getSession(proxyUser, proxyHost, 22);
    java.util.Properties config = new java.util.Properties();
    config.put("StrictHostKeyChecking", "no");
    session.setConfig(config);
    session.setPassword(proxyPassword);

    session.setConfig("PreferredAuthentications", "publickey,keyboard-interactive,password");
    session.connect();
    session.setPortForwardingL(localPort, proxyHost, 3306);


    Properties properties = new Properties();
    properties.setProperty("user", user);
    properties.setProperty("password", password);
    properties.setProperty("useUnicode", "true");
    properties.setProperty("characterEncoding", "UTF-8");
    Class.forName("com.mysql.jdbc.Driver").newInstance();
    con = DriverManager.getConnection(
            "jdbc:mysql://" + url + ":3306/" + nameBD + "?autoReconnect=true", properties);

Строка ошибки "Невозможно создать соединение с сервером базы данных. Попытка переподключиться 3 раза. Отказ"

Ошибка при выполнении этого: " con = DriverManager.getConnection (...) "

Помогите мне, пожалуйста

1 Ответ

0 голосов
/ 01 ноября 2018

Отладка чего-то подобного, вероятно, лучше всего сделать с помощью wireshark , который позволит вам увидеть, что на самом деле происходит на проводе, и быстро выяснить, что не совсем верно (тм), Если вы не знакомы с этим инструментом, существует множество учебных пособий на выбор.

Я думаю, что в основном вам просто нужно, чтобы все совпадало, и все будет хорошо:

  • LocalPort в настоящее время установлено на 1234, но DriverManager.getConnection пытается подключиться к 3306.
  • Фрагмент скрипта неполон, поэтому я предполагаю, что url имеет значение
    localhost / 127.0.0.1 в другом месте ...
  • jsch.getSession и session.setPortForwardingL оба используют proxyHost в качестве пункта назначения: я предполагаю, что у вас есть брандмауэр на хосте (именно поэтому вы используете ssh), поэтому попытка локального подключения к адресу внешнего интерфейса также может быть заблокирован. Это означает, что session.setPortForwardingL, вероятно, должно быть тоже localhost / 127.0.0.1.
...