【问题标题】:Datastax Cassandra - Cqlsh with SSL not workingDatastax Cassandra - 使用 SSL 的 Cqlsh 不起作用
【发布时间】:2016-08-23 08:32:59
【问题描述】:

我在我的 Ubuntu 机器上安装了一个单节点 Datastax Cassandra v3.5 集群。我正在尝试使用 SSL 选项使用命令行界面 cqlsh 连接到节点,但没有成功(来自同一台机器)。我遵循的步骤是:

  • 按照本指南 http://docs.datastax.com/en/cassandra/2.0/cassandra/security/secureSSLCertificates_t.html 准备了 .keystore、.cer 证书和 .truststore
  • 相应地修改了我的 cassandra.yaml:

    client_encryption_options: enabled: true optional: false keystore: /************************/.keystore keystore_password: ************************ require_client_auth: false # Set trustore and truststore_password if require_client_auth is true truststore: /************************/.truststore truststore_password: ************************

  • 创建了一个 cqlshrc conf 文件并按照本指南 https://docs.datastax.com/en/cassandra/2.1/cassandra/security/secureCqlshSSL_t.html 填充它:

    [connection] hostname = ***** port = 9042 factory = cqlshlib.ssl.ssl_transport_factory [ssl] certfile = /home/conf/mycert.cer validate = true ## Optional, true by default

所以基本上我创建了一个私钥和公钥,将 Cassandra 指向我的 .keystore 和 .truststore(即使我认为没有必要,因为我没有强制执行客户端身份验证)并将 cqlsh 指向公钥(证书)。

每当我尝试启动 cqlsh --ssl 时,我总是会收到相同的错误,并且在 Cassandra 中没有一条调试消息。错误信息是:

连接错误:('无法连接到任何服务器', {'*.*****.******': error(0, "尝试连接到 [('..*.***', 9042)]。最后一个错误:_ssl.c:344:error:00000000:lib(0):func(0):reason(0)")})

顺便说一句,如果我删除 SSL 身份验证,一切都会正常运行。

编辑

我已经按照@Adam Holmberg 的建议解决了我最初的问题,但 SSL 连接仍然没有运气。我检查了我是否安装了 JCE 库,并且我一直在尝试强制 cqslh 使用 SSLv23 或 TLSv1 建立与 Cassandra 服务器的连接,但我一直收到以下错误:

连接错误:('无法连接到任何服务器', ... ... ... 最后一个错误:_ssl.c:510: EOF 发生违反协议")})

此外,我还添加了 JVM 选项 -Djavax.net.debug=all 无济于事,我没有看到任何关于 ssl 的额外日志。

【问题讨论】:

  • 您是否安装了 JCE 库?
  • 只是一个想法,但您需要支持双向 SSL 吗?如果没有,请尝试在 cqlshrc 和 cassandra.yaml 中设置 validate = false

标签: ssl cassandra datastax


【解决方案1】:

假设“/home/conf/mycert.cer”是您在服务器配置期间创建的文件,这不是 Python (cqlsh) 的正确格式。您需要将其导出为 PEM 格式的 Python:

keytool -exportcert -alias <alias> -keypass <pass> -keystore <keystore> -storepass <pass> -rfc -file cassandra_cert.pem

如果您只是在试验 cqlsh 并且不关心真正的安全性,您还可以从 cqlshrc 中省略这些选项(验证、证书文件),并且不进行证书验证连接。

【讨论】:

  • 感谢您的回复。现在我面临另一个错误:Last error: _ssl.c:510: error:1408F10B:SSL routines:SSL3_GET_RECORD:wrong version number")}),看起来 Cassandra 和 cqlsh 之间存在 SSL 版本不匹配。这怎么可能?
  • 正如 Aaron 提到的,确保您安装了 JCE 无限强度策略文件,然后重新启动服务器。您可以尝试显式设置版本client-side,但默认值应该可以工作。您可能还想在 java 中打开 ssl debugging 以获得更好的洞察力。
  • 还是没有运气。我已经有了 JCE,尝试使用 python ssl 脚本,但没有任何效果。最终,当我在 cqlsh 配置文件中强制执行 SSLv23 或 TLSv1 时出现此错误:Connection error: ('Unable to connect to any servers', ... ... ... Last error: _ssl.c:510: EOF occurred in violation of protocol")})
  • 一些谷歌搜索表明此错误有时与未使用 TLSv1 的客户端有关。如果您想进入故障排除模式,您可以验证设置了哪些 ssl_options here。还有建议(上)打开 ssl 调试服务器端。
【解决方案2】:

经过反复试验以及@Adam 和@Aaron 提供的一些有用提示(感谢您的帮助),我终于在 cqlsh 和我的 Cassandra 服务器实例之间建立了 SSL 连接。

在思考了这个问题后,我得出的结论是客户端和服务器都存在某种额外的配置错误,为了帮助可能面临同样问题的其他人,我将在此处发布我的最终配置:

cqlshrc

[connection]
hostname = *****.*****.*****.*****.*****
port = 9042

[cql]
version = 3.4

[tracing]
max_trace_wait = 10.0

[ssl]
certfile = /****/****/****/****.cer.pem
validate = false ## Optional, true by default
#version = SSLv23
#factory = cqlshlib.ssl.ssl_transport_factory

cassandra.yaml(相关部分)

# enable or disable client/server encryption.
client_encryption_options:
    enabled: true
    # If enabled and optional is set to true encrypted and unencrypted connections are handled.
    optional: false
    keystore: /***/****/****/.keystore
    keystore_password: *********
    require_client_auth: false
    # Set trustore and truststore_password if require_client_auth is true
    truststore: /****/****/****/.truststore
    truststore_password: ****
    # More advanced defaults below:
    # protocol: TLSv1
    # algorithm: SunX509
    # store_type: JKS
    # cipher_suites: [TLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_256_CBC_SHA,TLS_DHE_RSA_WITH_AES_128_CBC_SHA,TLS_DHE_RSA_WITH_AES_256_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA]

【讨论】:

    【解决方案3】:

    我收到了错误: 最后一个错误:[SSL] 内部错误 (_ssl.c:727)

    解决这个问题的方法是在 cqlshrc 文件中添加 SSL 版本的行:

    [connection]
    (...)
    version = SSLv23
    

    【讨论】:

      猜你喜欢
      • 2016-01-19
      • 2014-08-18
      • 2017-03-12
      • 2017-05-10
      • 1970-01-01
      • 2023-03-30
      • 2017-03-03
      • 2015-02-05
      • 2021-11-12
      相关资源
      最近更新 更多