如何使用 JDBC 驱动程序和 SSL 连接连接到 Sybase ASE

How to connect to Sybase ASE using JDBC driver and SSL connection

我正在尝试使用 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。

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

谢谢

经过多方调查,我找到了解决办法。实际上是 2 个。

  1. 使用信任所有证书JDBC 连接字符串参数: 如果您不介意信任所有证书(仅当您完全信任您正在使用的网络时才这样做,尤其是不信任 public 互联网上发生的任何事情),您可以添加一个连接字符串来指示 SSLSocketFactory 创建信任所有证书的连接。连接字符串如下所示:jdbc:sybase:Tds:host:port/dbname?ENABLE_SSL=true&SSL_TRUST_ALL_CERTS=true
  2. 使用sybase证书: 需要将证书导入 java 应用程序信任库。 如果您没有使用指定的信任库,它可能会导入到 $JAVA_HOME\jreX\lib\security\cacerts 下的 Java 默认信任库。可以使用 keytool 导入证书,如 here.
  3. 所述

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

  1. 创建spark会话时提供正确的jdbc支持ssl的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. Use right string to load driver in option. Earlier I was using 'com.sybase.jdbc4.jdbc.SybDriver' which didnt work. Then below worked for me - .option("driver", "com.sybase.jdbc4.jdbc.SybDriver") ​ 4. Use right connection string to provide additional ssl options as per the driver. E.g. - .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)