Cassandra:如何设置客户端到节点的加密?

Posted

技术标签:

【中文标题】Cassandra:如何设置客户端到节点的加密?【英文标题】:Cassandra: how to setup client-to-node encryption? 【发布时间】:2015-02-11 14:57:22 【问题描述】:

我已经使用 DataStax guide 设置了 Cassandra 客户端到节点加密

来自 cassandra.yaml 文件的Client_encription_options:

 client_encryption_options:
    enabled: true
    keystore: /opt/key/.keystore
    keystore_password: cassandra
    cipher_suites:[TLS_RSA_WITH_AES_128_CBC_SHA,TLS_DHE_RSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA]        

使用 SSL 的默认 Java 系统属性的客户端:

-Djavax.net.ssl.trustStore=/opt/app/conf/.truststore -Djavax.net.ssl.trustStorePassword=cassandra    

但连接后 Cassandra 日志出错:

INFO [Native-Transport-Requests:12] 2015-02-11 11:45:52,456 Message.java (line 397) Unexpected exception during request; channel = [id: 0xfb3df0e3, /192.168.43.13:32885 => /192.168.43.10:9042]
org.jboss.netty.handler.ssl.NotSslRecordException: not an SSL/TLS record: 01000001000000160001000b43514c5f56455253494f4e0005332e302e30
at org.jboss.netty.handler.ssl.SslHandler.decode(SslHandler.java:871)
at org.jboss.netty.handler.codec.frame.FrameDecoder.callDecode(FrameDecoder.java:425)
at org.jboss.netty.handler.codec.frame.FrameDecoder.messageReceived(FrameDecoder.java:303)
at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:268)
at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:255)
at org.jboss.netty.channel.socket.nio.NioWorker.read(NioWorker.java:88)
at org.jboss.netty.channel.socket.nio.AbstractNioWorker.process(AbstractNioWorker.java:109)
at org.jboss.netty.channel.socket.nio.AbstractNioselector.run(AbstractNioSelector.java:312)
at org.jboss.netty.channel.socket.nio.AbstractNioWorker.run(AbstractNioWorker.java:90)
at org.jboss.netty.channel.socket.nio.NioWorker.run(NioWorker.java:178)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)    

我正在使用 Cassandra 2.0.10.71、Java 1.7.0_75 和 Java 加密扩展库

【问题讨论】:

您是否确认您正在发送加密数据?此错误基本上表示数据包未使用 SSL(v2 或 v3)或 TLS 协议加密。 你能不能把cqlsh设置成客户端,看看能不能让它工作。我倾向于认为您在客户端而不是服务器端有问题。 datastax.com/documentation/cassandra/2.0/cassandra/security/… 【参考方案1】:

这是一条 INFO 消息,表明您的 Cassandra 节点已设置无 ssl 包。似乎有什么东西试图连接到您的 Cassandra 节点。

查看引发异常的 Netty java 文件的源代码。 org.jboss.netty.handler.ssl.SslHandler.decode(SslHandler.java:871)

  if (nonSslRecord) 
       // Not an SSL/TLS packet
        NotSslRecordException e = new NotSslRecordException(
        "not an SSL/TLS record: " + ByteBufUtil.hexDump(in));
        in.skipBytes(in.readableBytes());
            ctx.fireExceptionCaught(e);
            setHandshakeFailure(ctx, e);
   

http://grepcode.com/file/repo1.maven.org/maven2/io.netty/netty-handler/4.0.30.Final/io/netty/handler/ssl/SslHandler.java#SslHandler

https://issues.jboss.org/browse/NETTY-301

【讨论】:

以上是关于Cassandra:如何设置客户端到节点的加密?的主要内容,如果未能解决你的问题,请参考以下文章

Cassandra有两个冗余节点

如何在 Quarkus 的配置中使用加密 Cassandra 密码凭据?

cassandra-replication_factor 和 consistency level

2 节点 Cassandra 集群中的故障转移和复制

如何在启用TDE的情况下查询Cassandra中的敏感数据?

如何清理 Cassandra 集群