Как подключиться к Sybase ASE с помощью драйвера JDBC и SSL-соединения

Я пытаюсь установить SSL-соединение с Sybase ASE 15.7, используя драйвер JDBC, но безуспешно. Я попробовал следующие варианты:

  1. Использование драйвера JTDS 1.25 (jtds-1.2.5.jar)

    Со следующей строкой подключения: jdbc:jtds:sybase://host:port;databaseName=dbname;ssl=request

    я получил Network error IOException: Connection refused

  2. Использование Jconnect 4 (jconn4.jar)

    со следующей строкой подключения:

    JDBC: Sybase:Tds: хост: порт / имя_бд ENABLE_SSL= верно?

    я получил java.sql.SQLException: JZ00L: Login failed. Examine the SQLWarnings chained to this exception for the reason(s) ... java.sql.SQLException: I/O Error: DB server closed connection.

    Я проверил журнал Sybase увидеть следующую ошибку:

    kernel SSL or Crypto Error Message: 'The SSL handshake failed. Root error: error:140760FC:SSL routines:SSL23_GET_CLIENT_HELLO:unknown protocol'.

    похоже, что сервер Sybase ожидает SSL-соединение, но java-клиент все еще не использует SSL (хотя свойство строки подключения помечает ssl=true).

попытался найти документацию по Sybase без особой удачи ни по этой ошибке, ни по SSL с JConnect.

Любой ответ будет высоко оценен - ​​я гибок с типом драйвера и конфигурацией.

Спасибо

2 ответа

Решение

После долгих исследований я нашел решение. 2 на самом деле.

  1. Использование параметра строки соединения JDBC для доверяющих сертификатов: если вы не против доверять всем сертификатам (делайте это только в том случае, если вы полностью доверяете сети, в которой вы работаете, особенно не обращаясь к общедоступному Интернету), вы можете добавить соединение строка, указывающая SSLSocketFactory, создающий соединение, чтобы доверять всем сертификатам. Строка подключения будет выглядеть следующим образом: jdbc:sybase:Tds:host:port/dbname?ENABLE_SSL=true&SSL_TRUST_ALL_CERTS=true
  2. Использование сертификата sybase: сертификат необходимо импортировать в доверенное хранилище java-приложений. в случае, если вы не работаете с назначенным хранилищем доверия, его можно импортировать в хранилище доверия Java по умолчанию, которое находится в $JAVA_HOME\jreX\lib\security\cacerts, Сертификат может быть импортирован с помощью keytool, как описано здесь.

Хотя ответ Цукерманори предоставляет некоторые ключевые детали, добавление дополнительных шагов ниже, которые необходимы:

  1. Предоставьте правую jdbc jar, которая поддерживает ssl при создании сеанса искры. Раньше я использовал jconn3-6.0.0.jar, который не поддерживает ssl. Позже я использовал jconnect-16.0_SP02.jar, который работал нормально. Пример команды pyspark для передачи jar-файла драйвера:

pyspark --jars / путь / к / вашему / jdbc / driver / jar

  1. Предоставьте дополнительные аргументы java, как показано ниже, в той же команде, чтобы указать местоположение доверенного хранилища (которое имеет сертификаты):

--conf spark.driver.extraJavaOptions = "- Djavax.net.ssl.trustStore = / path / to / truststore -Djavax.net.ssl.trustStorePassword = your_truststore_password" 3. Используйте правую строку для загрузки драйвера в опции. Раньше я использовал com.sybase.jdbc4.jdbc.SybDriver, который не работал. Затем у меня сработало следующее - .option ("driver", "com.sybase. Jdbc4 .jdbc.SybDriver") 4. Используйте правильную строку подключения, чтобы предоставить дополнительные параметры ssl в соответствии с драйвером. Например - .option ("url", "jdbc:sybase:Tds:host_name:ssl_port / database_name?ENABLE_SSL= true &SSL_TRUST_ALL_CERTS= true & ssl =request")

  1. Требуются дополнительные опции -

.option("ssl", True) .option ("sslmode", "require")

Подводя итог, вот как должна выглядеть ваша команда pyspark (если вы используете режим пряжи, то хранилище доверенных сертификатов должно быть доступно на всех узлах. Ниже приведен пример локального режима искры) -

pyspark --jars /path / to / your / jdbc / driver / jar --conf spark.driver.extraJavaOptions= "- Djavax.net.ssl.trustStore = / path / to / truststore -Djavax.net.ssl.trustStorePassword = your_truststore_password» --master местный

И вот как выглядит ваше чтение jdbc -

spark.read.format("jdbc"). option ("url", "jdbc:sybase:Tds:host_name:ssl_port / database_name?ENABLE_SSL= true &SSL_TRUST_ALL_CERTS= true & ssl =request"). option ("driver", "com.sybase.jdbc4.jdbc.SybDriver"). option (" ssl ", True) .option ("sslmode"," require"). option (" user "," your_user_name"). option ("password"," your_password") .option ("dbtable", "db.dbo.table_name"). load ().show(5)

Другие вопросы по тегам