Flink CDC里The driver could not establish a secure connection to SQL Server by using Secure Sockets Layer (SSL) encryption. Error: "The server selected protocol version TLS10 is not accepted by client preferences [TLS13, TLS12]". sqlserver版本太低 不支持 tls1.2 1.3 cdc端应该如何加参数可以忽略这个错误?
其他的回答都试过,没什么用。
根本的原因是taskmanager和sqlserver在进行ssl连接时,两边的协议版本不一致导致,两个地方需要检查,第一是客户端使用的tls算法,第二是客户端使用的驱动版本(如果sqlserver版本低、驱动版本过高flinkcdc也会报这个错)。
驱动版本过高DataGrip连接报错信息:
如果是驱动版本问题,那就需要重置制作flink镜像,把高版本的驱动替换为合适的低版本驱动。
1、修改taskmanager的java.security文件,使其支持低版本的tls算法,具体路径为:
java8:{jre-path}/lib/security/java.security,
java11+:{jre-path}/conf/security/java.security
找到jdk.tls.disabledAlgorithms配置项,删除TLSv1和TLSv1.1:
如果部署采用的是flink on k8s,此种方式需要修改镜像,可使用第二种方式。
2、taskmanager启动时动态指定:
-Djdk.tls.disabledAlgorithms=xxxx,
可以在flink-conf.yaml中使用如下方式动态指定:
env.java.opts.taskmanager: "-Djdk.tls.disabledAlgorithms=SSLv3, RC4, DES, MD5withRSA, DH keySize < 1024, EC keySize < 224, 3DES_EDE_CBC, anon, NULL, include jdk.disabled.namedCurves"
我使用的dinky为0.7.3,flink为1.17.1,jre为11。
注意1:在实际的操作过程中发现如果只指定
env.java.opts.taskmanager: "-Djdk.tls.disabledAlgorithms=xxx",
系统变量传递不到taskmanager的java进程中,而下面这种方式却可以正常传递:
env.java.opts.taskmanager: "-Duser.timezone=GMT+8 -Djdk.tls.disabledAlgorithms=xxx",
有些令人费解、未作深究。
注意2:jdk.tls.disabledAlgorithms指定的内容要基于taskmanager使用的jre进行修改,否则可能会出现一些稀奇古怪的问题。
在Flink CDC中,如果SQL Server版本太低不支持TLS 1.2或1.3,可以尝试通过添加JVM参数来忽略这个错误。具体操作如下:
打开Flink CDC的配置文件(例如:flink-conf.yaml)。
在配置文件中添加以下JVM参数:
taskmanager.network.netty.tcp.allowed-protocols: TLSv1,TLSv1.1,TLSv1.2,TLSv1.3
这将允许Flink CDC使用TLS 1.0、1.1、1.2和1.3协议进行连接。请注意,这可能会导致安全风险,因为较旧的TLS协议可能不够安全。因此,建议尽量升级SQL Server的版本以支持更高版本的TLS协议。
要解决这个问题,您可以尝试在Flink CDC的配置文件中添加以下参数来忽略TLS 1.2和TLS 1.3协议版本:
sqlserver:
connector:
type: sqlserver-cdc
username: your_username
password: your_password
server-name: your_server_name
database-name: your_database_name
port: your_port
ssl:
enabled: true
cacert: /path/to/your/cacert.pem
client-key: /path/to/your/client-key.pem
client-cert: /path/to/your/client-cert.pem
protocol-versions: TLSv1,TLSv1.1
在这个例子中,我们将protocol-versions
设置为TLSv1
和TLSv1.1
,这将允许客户端接受TLS 1.0和TLS 1.1协议版本。请注意,这可能会导致安全问题,因为较旧的协议版本可能不安全。因此,建议您尽可能使用最新的TLS协议版本。
参考
https://github.com/ververica/flink-cdc-connectors/issues/2991
。此回答来自钉群Flink CDC 社区。
通过报错的日志分析的原因:
Flink CDC(Change Data Capture)无法与 SQL Server 建立安全的 SSL 连接,因为 SQL Server 使用的是较低版本的 TLS(传输层安全协议),而 Flink CDC 客户端的偏好是使用 TLS1.2 或 TLS1.3。
解决方案:
您可以在 Flink CDC 客户端的配置中添加参数来忽略这个错误。但是,请注意,这将降低连接的安全性,因为您将绕过 SSL/TLS 的检查。以下是一个示例参数,可以在 Flink CDC 的连接配置中添加:
java
.option("ssl-handshake-mode", "legacy")
这将会使 Flink CDC 客户端使用旧版的 SSL 握手模式,以兼容较低版本的 TLS。
请注意,使用旧版握手模式可能会带来安全风险,因为它可能使您的应用程序容易受到某些已知的 SSL/TLS 攻击的影响。因此,如果可能的话,最好的解决方案是升级 SQL Server 到支持 TLS1.2 或 TLS1.3 的版本。
希望能够帮助到你
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
实时计算Flink版是阿里云提供的全托管Serverless Flink云服务,基于 Apache Flink 构建的企业级、高性能实时大数据处理系统。提供全托管版 Flink 集群和引擎,提高作业开发运维效率。