You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Databricks Runtime10.4 JDBC连SQLServer正常,12.2用sqlserver格式报错

问题:Databricks Runtime 12.2使用SQL Server新连接方式触发SSL证书错误

背景

在Databricks Runtime 10.4中,使用旧JDBC驱动可成功读取SQL Server数据,代码如下:

remote_table = (
  spark.read.format("jdbc")
    .option("driver", "com.microsoft.sqlserver.jdbc.SQLServerDriver")
    .option("url", "jdbc:sqlserver://mydomainname.com;database=Runtime")
    .option("dbtable", "Runtime.dbo.History")
    .option("user", "myusername")
    .option("password", "mypassword")
    .load()
)

切换至Runtime 12.2集群后,采用官方新的SQL Server连接方式,代码如下:

remote_table = (spark.read
  .format("sqlserver")
  .option("host", "mydomainname.com")
  .option("user", "myusername")
  .option("password", "mypassword")
  .option("database", "Runtime")
  .option("dbtable", "Runtime.dbo.History")
  .load()
)

报错信息

com.microsoft.sqlserver.jdbc.SQLServerException: The driver could not establish a secure connection to SQL Server by using Secure Sockets Layer (SSL) encryption. Error: "PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target". ClientConnectionId:56f3b77d-a90a-4c89-98be-88924f364897

解决方案

方案1:临时禁用SSL验证(仅适用于测试环境)

添加encrypt=false参数跳过SSL证书校验,修改后的代码:

remote_table = (spark.read
  .format("sqlserver")
  .option("host", "mydomainname.com")
  .option("user", "myusername")
  .option("password", "mypassword")
  .option("database", "Runtime")
  .option("dbtable", "Runtime.dbo.History")
  .option("encrypt", "false")
  .load()
)

⚠️ 生产环境禁止使用此方案,会导致连接安全性降低。

方案2:导入SQL Server CA证书至集群

  1. 获取SQL Server的根CA证书(通常为.cer格式);
  2. 将证书上传至Databricks的DBFS路径(例如dbfs:/certificates/sqlserver-ca.cer);
  3. 编辑集群配置,在Spark > Spark config中添加以下参数:
    spark.driver.extraJavaOptions -Djavax.net.ssl.trustStore=/dbfs/certificates/sqlserver-ca.cer
    spark.executor.extraJavaOptions -Djavax.net.ssl.trustStore=/dbfs/certificates/sqlserver-ca.cer
    
  4. 重启集群后重新执行连接代码。

方案3:通过JDBC URL指定证书参数

利用sqlserver格式支持的JDBC扩展参数,直接在URL中配置SSL相关选项:

remote_table = (spark.read
  .format("sqlserver")
  .option("url", "jdbc:sqlserver://mydomainname.com;database=Runtime;encrypt=true;trustStore=/dbfs/certificates/sqlserver-ca.cer")
  .option("user", "myusername")
  .option("password", "mypassword")
  .option("dbtable", "Runtime.dbo.History")
  .load()
)

如果不需要严格校验证书,也可以使用trustServerCertificate=true替代证书路径:

remote_table = (spark.read
  .format("sqlserver")
  .option("url", "jdbc:sqlserver://mydomainname.com;database=Runtime;encrypt=true;trustServerCertificate=true")
  .option("user", "myusername")
  .option("password", "mypassword")
  .option("dbtable", "Runtime.dbo.History")
  .load()
)

内容的提问来源于stack exchange,提问作者Oliver Angelil

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 22:23:11