Python脚本连接Cassandra遇阻,求简便SSL连接解决方案
Python连接Cassandra数据库问题
我用Python连接Cassandra时碰到了麻烦:连接需要4个主机地址、集群凭证,还有JKS格式的信任库文件及对应密码。用公司提供的DataStax客户端能正常连接,但用Python脚本实现时一直出问题。我试过把JKS转成PEM格式,结果连接超时,网上能找到的方案都试遍了没用。有没有简单点的解决办法?备注:我没有私钥文件,只有一个不含内部私钥的JKS文件。
我试过的转换命令如下:
$ keytool -list -v -keystore truststore.jks $ keytool -export -alias <alias> -file cert.pem -keystore truststore.jks $ keytool -importkeystore -srckeystore truststore.jks -srcstoretype jks -destkeystore truststore.p12 -deststoretype pkcs12 -srcalias <alias> -deststorepass password $ openssl pkcs12 -in truststore.p12 -cacerts -out truststore.pem -nokeys
解决方法
方法1:直接使用JKS信任库(无需转换)
cassandra-driver本身支持直接加载JKS格式的信任库,不用转成PEM,步骤如下:
- 安装依赖包:
pip install cassandra-driver cryptography
- 编写连接代码:
from cassandra.cluster import Cluster from cassandra.auth import PlainTextAuthProvider from cassandra.ssl import SSLContext, PROTOCOL_TLS_CLIENT # 替换成你的实际配置 contact_points = ["host1.example.com", "host2.example.com", "host3.example.com", "host4.example.com"] username = "your_cluster_username" password = "your_cluster_password" jks_path = "./truststore.jks" jks_password = "your_jks_password" cassandra_port = 9042 # 默认为9042,根据实际情况调整 # 配置认证 auth_provider = PlainTextAuthProvider(username=username, password=password) # 配置SSL上下文,直接加载JKS信任库 ssl_context = SSLContext(PROTOCOL_TLS_CLIENT) ssl_context.load_verify_locations( truststore=jks_path, truststore_password=jks_password ) # 创建集群并连接 cluster = Cluster( contact_points=contact_points, auth_provider=auth_provider, ssl_context=ssl_context, port=cassandra_port ) try: session = cluster.connect() # 测试连接是否成功 row = session.execute("SELECT release_version FROM system.local").one() print(f"连接成功!Cassandra版本:{row.release_version}") except Exception as e: print(f"连接失败:{str(e)}") finally: cluster.shutdown()
方法2:正确转换JKS到PEM(避免漏证书)
如果一定要转PEM,之前的问题可能是只导出了单个别名的证书,而JKS里可能包含多个CA证书。以下是导出所有证书的命令:
# 替换成你的JKS密码 JKS_PASSWORD="your_jks_password" JKS_FILE="truststore.jks" OUTPUT_PEM="full_truststore.pem" # 列出所有别名并导出,合并成一个PEM文件 > "$OUTPUT_PEM" for alias in $(keytool -list -keystore "$JKS_FILE" -storepass "$JKS_PASSWORD" | grep -E "^Alias name:" | awk '{print $3}'); do keytool -export -alias "$alias" -keystore "$JKS_FILE" -storepass "$JKS_PASSWORD" -file temp.crt -rfc cat temp.crt >> "$OUTPUT_PEM" rm temp.crt done
转换完成后,用这个PEM文件配置SSL:
ssl_context = SSLContext(PROTOCOL_TLS_CLIENT) ssl_context.load_verify_locations(cafile="full_truststore.pem")
额外检查项
- 确认Python脚本所在机器能访问所有Cassandra节点的9042端口(可以用
telnet host1 9042测试) - 核对主机地址、凭证、JKS密码和DataStax里的配置完全一致
- 确保JKS文件没有损坏,能正常用keytool读取
内容的提问来源于stack exchange,提问作者vinay sharma
相关产品推荐
相关产品推荐

