PySpark连接SQL Server报TLS10协议不被接受如何不修改服务端解决
问题说明
报错信息如下:
The server selected protocol version TLS10 is not accepted by client preferences [TLS12]
该报错的根因是本地JDK默认禁用了TLS1.0协议,而目标SQL Server服务端仅支持TLS1.0版本完成握手,无需修改服务端的前提下可通过以下方案解决:
方案1:修改JDBC连接参数(优先级最高,仅需修改代码)
直接在JDBC连接URL中新增TLS协议兼容参数,修改后的代码如下:
jdbcDF = spark.read \ .format("jdbc") \ .option("url","jdbc:sqlserver://<host>\\<port>;database=<database>;enabledTLSProtocols=TLSv1,TLSv1.1,TLSv1.2;sslProtocol=TLS;") \ .option("dbtable", <table>) \ .option("user", <username>) \ .option("password", <password>) \ .option("driver", "com.microsoft.sqlserver.jdbc.SQLServerDriver") \ .load()
如果连接仍报错,可以额外在URL中添加encrypt=false;trustServerCertificate=true;参数,跳过证书校验环节。
方案2:修改JDK安全配置(永久生效,适合本地开发场景)
找到PySpark环境使用的JDK安装路径,进入jre/lib/security目录,编辑java.security文件:
- 找到
jdk.tls.disabledAlgorithms配置行 - 删除该行中的
TLSv1、TLSv1.1条目,保存后重启PySpark进程即可
方案3:Spark启动时传入JVM参数(无需修改代码和全局配置文件)
启动pyspark或者提交Spark任务时,新增JVM参数覆盖TLS禁用规则,命令示例:
pyspark --conf spark.driver.extraJavaOptions="-Djdk.tls.disabledAlgorithms=SSLv3, RC4, DES, MD5withRSA, DH keySize < 1024, EC keySize < 224, 3DES_EDE_CBC, anon, NULL"
如果是在代码中初始化SparkSession,可以在构建时添加该配置:
from pyspark.sql import SparkSession spark = SparkSession.builder \ .appName("SQLServerConn") \ .config("spark.driver.extraJavaOptions", "-Djdk.tls.disabledAlgorithms=SSLv3, RC4, DES, MD5withRSA, DH keySize < 1024, EC keySize < 224, 3DES_EDE_CBC, anon, NULL") \ .getOrCreate()
内容的提问来源于stack exchange,提问作者Cristian Ispan
相关产品推荐
相关产品推荐

