2

我正在尝试使用 JDBC 驱动程序建立与 Sybase ASE 15.7 的 SSL 连接,但没有成功。我尝试了以下选项:

  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:host:port/dbname?ENABLE_SSL=true

    我有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 文档时运气不佳,无论是针对此错误还是针对带有 JConnect 的 SSL。

任何答案将不胜感激 - 我对驱动程序的类型和配置很灵活。

谢谢

4

2 回答 2

2

经过大量调查,我找到了解决方案。2 其实。

  1. 使用信任所有证书 JDBC 连接字符串参数:如果您不介意信任所有证书(仅当您完全信任您正在工作的网络时才这样做,尤其是公共互联网上的任何内容),您可以添加一个连接指示 SSLSocketFactory 创建连接以信任所有证书的字符串。连接字符串如下所示:jdbc:sybase:Tds:host:port/dbname?ENABLE_SSL=true&SSL_TRUST_ALL_CERTS=true
  2. 使用 sybase 证书:需要将证书导入 java 应用程序信任库。如果您没有使用指定的信任库,它可能会被导入到$JAVA_HOME\jreX\lib\security\cacerts. 可以使用 keytool 导入证书,如此所述。
于 2015-10-29T11:06:27.863 回答
0

尽管 zuckermanori 的回答提供了一些关键细节,但在下面添加了更多需要的步骤 -

  1. 在创建 Spark 会话时提供支持 ssl 的正确 jdbc jar。我之前使用的是不支持 ssl 的 jconn3-6.0.0.jar。后来,我使用了 jconnect-16.0_SP02.jar,效果很好。传递驱动程序 jar 的示例 pyspark 命令将是 -

pyspark - -jars /path/to/your/jdbc/driver/jar

  1. 在同一命令中提供如下附加的 java args 以提供信任存储位置(具有证书) -

--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 命令的外观(如果您使用的是 yarn 模式,那么 truststore 应该可以在所有节点上访问。下面是 spark 本地模式的示例) -

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 local

这就是你的 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)

于 2021-09-03T08:22:49.250 回答