如何使用 JDBC 驱动程序和 SSL 连接连接到 Sybase ASE
How to connect to Sybase ASE using JDBC driver and SSL connection
我正在尝试使用 JDBC 驱动程序建立与 Sybase ASE 15.7 的 SSL 连接,但没有成功。
我尝试了以下选项:
使用 JTDS 1.25 驱动程序 (jtds-1.2.5.jar)
使用以下连接字符串:jdbc:jtds:sybase://host:port;databaseName=dbname;ssl=request
我得到了Network error IOException: Connection refused
使用 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 个。
- 使用信任所有证书JDBC 连接字符串参数:
如果您不介意信任所有证书(仅当您完全信任您正在使用的网络时才这样做,尤其是不信任 public 互联网上发生的任何事情),您可以添加一个连接字符串来指示 SSLSocketFactory 创建信任所有证书的连接。连接字符串如下所示:
jdbc:sybase:Tds:host:port/dbname?ENABLE_SSL=true&SSL_TRUST_ALL_CERTS=true
- 使用sybase证书:
需要将证书导入 java 应用程序信任库。
如果您没有使用指定的信任库,它可能会导入到
$JAVA_HOME\jreX\lib\security\cacerts
下的 Java 默认信任库。可以使用 keytool 导入证书,如 here. 所述
虽然 zuckermanori 的回答提供了一些关键细节,但在下面添加了更多需要的步骤 -
- 创建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
- 在同一命令中提供额外的 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")
- 需要其他选项 -
.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)
我正在尝试使用 JDBC 驱动程序建立与 Sybase ASE 15.7 的 SSL 连接,但没有成功。 我尝试了以下选项:
使用 JTDS 1.25 驱动程序 (jtds-1.2.5.jar)
使用以下连接字符串:
jdbc:jtds:sybase://host:port;databaseName=dbname;ssl=request
我得到了
Network error IOException: Connection refused
使用 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 个。
- 使用信任所有证书JDBC 连接字符串参数:
如果您不介意信任所有证书(仅当您完全信任您正在使用的网络时才这样做,尤其是不信任 public 互联网上发生的任何事情),您可以添加一个连接字符串来指示 SSLSocketFactory 创建信任所有证书的连接。连接字符串如下所示:
jdbc:sybase:Tds:host:port/dbname?ENABLE_SSL=true&SSL_TRUST_ALL_CERTS=true
- 使用sybase证书:
需要将证书导入 java 应用程序信任库。
如果您没有使用指定的信任库,它可能会导入到
$JAVA_HOME\jreX\lib\security\cacerts
下的 Java 默认信任库。可以使用 keytool 导入证书,如 here. 所述
虽然 zuckermanori 的回答提供了一些关键细节,但在下面添加了更多需要的步骤 -
- 创建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
- 在同一命令中提供额外的 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")
- 需要其他选项 -
.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)