cassandra 无法使用cqlsh连接到群集,获取“TLSv1_3不是有效的SSL协议”

t30tvxxf  于 11个月前  发布在  Cassandra
关注(0)|答案(2)|浏览(97)

当cassandra为TLSv1.3启用时,无法使用cqlsh连接cassandra 4.0.7。Datastax驱动程序版本为driver-3.25.0

./cqlsh --debug --ssl --cqlshrc /apache-cassandra/conf/cqlshrc <IP_ADDRESS> 9042
Using CQL driver: <module 'cassandra' from '/apache-cassandra/bin/../lib/cassandra-driver-internal-only-3.25.0.zip/cassandra-driver-3.25.0/cassandra/__init__.py'>
Using connect timeout: 5 seconds
Using 'utf-8' encoding
Using ssl: True
TLSv1_3 is not a valid SSL protocol, please use one of TLS, TLSv1_2, TLSv1_1, or TLSv1

请注意,所有cassandra节点都已启动并运行,应用程序也运行正常。

vddsk6oq

vddsk6oq1#

Cassandra 4.0.7中包含的cqlsh版本(cqlsh 6.0.0)似乎不支持TLS 1.3。这在get_best_tls_protocol方法的pylib/cqlshlib/sslhandling.py文件中显式可见:

if ssl_ver_str:
        return getattr(ssl, "PROTOCOL_%s" % ssl_ver_str, None)
    for protocol in ['PROTOCOL_TLS', 'PROTOCOL_TLSv1_2', 'PROTOCOL_TLSv1_1', 'PROTOCOL_TLSv1']:
        if hasattr(ssl, protocol):
            return getattr(ssl, protocol)
    return None

这里的一种方法是将cqlshrc文件的[SSL]部分中的version属性设置为“TLS”:

[ssl]
version = TLS

但更好的方法是不设置它。这两种方法中的任何一种都将导致它在协商最高可能的TLS版本时进行连接。
我推荐后者,因为Cassandra 4.1中包含的最新cqlsh版本(6.1.0)在设置该属性时显示警告,忽略其值,并自动协商TLS版本。

tnkciper

tnkciper2#

两年前,一些Java版本删除了对TLS v1.0和v1.1的支持,因为它们不再被认为是安全的(JDK-8202343)。
在此之后,cqlsh添加了一个检查,以优先选择较新的TLS版本而不是旧版本(CASSANDRA-16695)。但是,该更改无意中没有将TLS v1.3作为版本之一。
在Cassandra 4.1中,cqlsh中删除了TLS版本特定的检查,因为驱动程序能够自动协商到客户端和服务器都支持的最高协议版本(CASSANDRA-17365)。
作为Cassandra 4.0中的一个解决方案,在连接到集群时不要指定协议版本,这样Cassandra Python驱动程序(嵌入在cqlsh中)将自动协商到TLS v1.3(如果集群支持它)。干杯!

相关问题