Cassandra SSL/TLS Cluster Setup Guide 2025: Modern Security with Cassandra 5.0

January 9, 2025

                                                                           

Overview

This guide demonstrates how to set up SSL/TLS encryption for Apache Cassandra 5.0 clusters using modern security practices. We’ll cover both client-to-node and node-to-node encryption using TLS 1.3, container-based deployments, and automated certificate management.

What’s New in 2025

Cassandra 5.0 Security Enhancements

  • Native TLS 1.3 Support: Full support for TLS 1.3 with improved performance and security
  • Dynamic Certificate Reloading: Hot-reload certificates without cluster restart
  • Mutual TLS (mTLS) by Default: Enhanced zero-trust security model
  • Improved JFR Integration: Better security event monitoring and auditing
  • Vector Search Security: Encrypted vector embeddings for AI workloads

Modern Infrastructure Updates

  • Container-First Deployment: Docker and Kubernetes native approaches
  • Service Mesh Integration: Istio/Linkerd for additional security layers
  • Certificate Automation: cert-manager and HashiCorp Vault integration
  • Cloud-Native Secrets: AWS Secrets Manager, Azure Key Vault, GCP Secret Manager
  • Zero-Trust Architecture: Enhanced network policies and RBAC

Prerequisites

  • Cassandra 5.0.x
  • Docker 24.x / Kubernetes 1.28+
  • OpenSSL 3.0+ or cert-manager 1.13+
  • kubectl and helm (for Kubernetes deployments)

Certificate Generation with Modern Tools

Option 1: Using cert-manager (Kubernetes)

# cert-manager-issuer.yaml
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: cassandra-ca-issuer
spec:
  ca:
    secretName: cassandra-ca-secret
---
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
  name: cassandra-node-cert
  namespace: cassandra
spec:
  secretName: cassandra-node-tls
  issuerRef:
    name: cassandra-ca-issuer
    kind: ClusterIssuer
  commonName: cassandra-node
  dnsNames:
  - cassandra-0.cassandra.svc.cluster.local
  - cassandra-1.cassandra.svc.cluster.local
  - cassandra-2.cassandra.svc.cluster.local
  - "*.cassandra.svc.cluster.local"
  duration: 8760h # 1 year
  renewBefore: 720h # 30 days
  usages:
  - digital signature
  - key encipherment
  - server auth
  - client auth

Option 2: Using OpenSSL with Modern Configuration

#!/bin/bash
# generate-certs.sh - Modern certificate generation script

# Create CA with TLS 1.3 compatible settings
openssl req -new -x509 -keyout ca-key.pem -out ca-cert.pem -days 3650 \
  -subj "/C=US/ST=CA/L=San Francisco/O=YourOrg/CN=Cassandra CA" \
  -addext "keyUsage=critical,keyCertSign,cRLSign" \
  -addext "basicConstraints=critical,CA:TRUE" \
  -nodes -newkey ec:secp384r1

# Generate node certificates with SAN
for node in cassandra-0 cassandra-1 cassandra-2; do
  # Create private key using ECDSA (more efficient than RSA)
  openssl genpkey -algorithm EC -pkeyopt ec_paramgen_curve:secp384r1 \
    -out ${node}-key.pem

  # Create CSR with SAN
  cat > ${node}-csr.conf <<EOF
[req]
distinguished_name = req_distinguished_name
req_extensions = v3_req

[req_distinguished_name]
CN = ${node}

[v3_req]
subjectAltName = @alt_names

[alt_names]
DNS.1 = ${node}
DNS.2 = ${node}.cassandra.svc.cluster.local
DNS.3 = localhost
IP.1 = 127.0.0.1
EOF

  openssl req -new -key ${node}-key.pem -out ${node}.csr \
    -config ${node}-csr.conf \
    -subj "/C=US/ST=CA/L=San Francisco/O=YourOrg/CN=${node}"

  # Sign certificate
  openssl x509 -req -in ${node}.csr -CA ca-cert.pem -CAkey ca-key.pem \
    -CAcreateserial -out ${node}-cert.pem -days 365 \
    -extensions v3_req -extfile ${node}-csr.conf
done

# Convert to PKCS12 for Java compatibility
for node in cassandra-0 cassandra-1 cassandra-2; do
  openssl pkcs12 -export -in ${node}-cert.pem -inkey ${node}-key.pem \
    -out ${node}.p12 -name ${node} -CAfile ca-cert.pem -caname "Cassandra CA" \
    -password pass:cassandra
done

# Create truststore
keytool -import -file ca-cert.pem -alias cassandra-ca -keystore truststore.jks \
  -storepass cassandra -noprompt -storetype PKCS12

Cassandra 5.0 SSL Configuration

Modern cassandra.yaml Configuration

# /etc/cassandra/cassandra.yaml

# Client-to-node encryption with TLS 1.3
client_encryption_options:
  enabled: true
  optional: false
  keystore: /etc/cassandra/certs/keystore.p12
  keystore_password: cassandra
  keystore_type: PKCS12
  truststore: /etc/cassandra/certs/truststore.jks
  truststore_password: cassandra
  truststore_type: PKCS12
  protocol: TLSv1.3
  cipher_suites:
    - TLS_AES_256_GCM_SHA384
    - TLS_AES_128_GCM_SHA256
    - TLS_CHACHA20_POLY1305_SHA256
  require_client_auth: true
  # New in 5.0: Dynamic certificate reloading
  enable_certificate_reload: true
  certificate_reload_interval_ms: 3600000 # 1 hour

# Node-to-node encryption
server_encryption_options:
  internode_encryption: all
  enable_legacy_ssl_storage_port: false
  keystore: /etc/cassandra/certs/keystore.p12
  keystore_password: cassandra
  keystore_type: PKCS12
  truststore: /etc/cassandra/certs/truststore.jks
  truststore_password: cassandra
  truststore_type: PKCS12
  protocol: TLSv1.3
  cipher_suites:
    - TLS_AES_256_GCM_SHA384
    - TLS_AES_128_GCM_SHA256
  require_client_auth: true
  enable_certificate_reload: true
  
# New in 5.0: Enhanced security settings
security:
  authentication_enabled: true
  authorization_enabled: true
  audit_logging_enabled: true
  encryption_at_rest:
    enabled: true
    key_provider: com.datastax.bdp.cassandra.crypto.kmip.KmipKeyProvider

Container Deployment

Dockerfile for Cassandra 5.0 with SSL

FROM cassandra:5.0

# Install certificate management tools
RUN apt-get update && apt-get install -y \
    openssl \
    ca-certificates \
    && rm -rf /var/lib/apt/lists/*

# Create certificate directory
RUN mkdir -p /etc/cassandra/certs

# Copy certificates (in production, use secrets)
COPY --chown=cassandra:cassandra certs/* /etc/cassandra/certs/

# Copy custom configuration
COPY --chown=cassandra:cassandra cassandra.yaml /etc/cassandra/
COPY --chown=cassandra:cassandra cassandra-env.sh /etc/cassandra/

# Add certificate refresh script
COPY --chown=cassandra:cassandra refresh-certs.sh /usr/local/bin/
RUN chmod +x /usr/local/bin/refresh-certs.sh

# Health check with SSL
HEALTHCHECK --interval=30s --timeout=10s --start-period=60s --retries=3 \
  CMD cqlsh --ssl -e "SELECT now() FROM system.local" || exit 1

EXPOSE 9042 7000 7001 9160

CMD ["cassandra", "-f"]

Docker Compose with SSL

version: '3.8'

services:
  cassandra-seed:
    build: .
    container_name: cassandra-seed
    hostname: cassandra-seed
    networks:
      - cassandra-net
    volumes:
      - cassandra-seed-data:/var/lib/cassandra
      - ./certs:/etc/cassandra/certs:ro
      - ./cassandra.yaml:/etc/cassandra/cassandra.yaml:ro
    environment:
      - CASSANDRA_CLUSTER_NAME=SecureCluster
      - CASSANDRA_DC=dc1
      - CASSANDRA_RACK=rack1
      - CASSANDRA_ENDPOINT_SNITCH=GossipingPropertyFileSnitch
      - CASSANDRA_SEEDS=cassandra-seed
      - JVM_OPTS=-Xms2G -Xmx2G
    healthcheck:
      test: ["CMD", "cqlsh", "--ssl", "-e", "SELECT now() FROM system.local"]
      interval: 30s
      timeout: 10s
      retries: 5

  cassandra-node1:
    build: .
    container_name: cassandra-node1
    hostname: cassandra-node1
    networks:
      - cassandra-net
    volumes:
      - cassandra-node1-data:/var/lib/cassandra
      - ./certs:/etc/cassandra/certs:ro
      - ./cassandra.yaml:/etc/cassandra/cassandra.yaml:ro
    environment:
      - CASSANDRA_CLUSTER_NAME=SecureCluster
      - CASSANDRA_DC=dc1
      - CASSANDRA_RACK=rack1
      - CASSANDRA_ENDPOINT_SNITCH=GossipingPropertyFileSnitch
      - CASSANDRA_SEEDS=cassandra-seed
      - JVM_OPTS=-Xms2G -Xmx2G
    depends_on:
      cassandra-seed:
        condition: service_healthy

  cassandra-node2:
    build: .
    container_name: cassandra-node2
    hostname: cassandra-node2
    networks:
      - cassandra-net
    volumes:
      - cassandra-node2-data:/var/lib/cassandra
      - ./certs:/etc/cassandra/certs:ro
      - ./cassandra.yaml:/etc/cassandra/cassandra.yaml:ro
    environment:
      - CASSANDRA_CLUSTER_NAME=SecureCluster
      - CASSANDRA_DC=dc1
      - CASSANDRA_RACK=rack1
      - CASSANDRA_ENDPOINT_SNITCH=GossipingPropertyFileSnitch
      - CASSANDRA_SEEDS=cassandra-seed
      - JVM_OPTS=-Xms2G -Xmx2G
    depends_on:
      cassandra-seed:
        condition: service_healthy

networks:
  cassandra-net:
    driver: bridge
    ipam:
      config:
        - subnet: 172.30.0.0/16

volumes:
  cassandra-seed-data:
  cassandra-node1-data:
  cassandra-node2-data:

Kubernetes Deployment with SSL

StatefulSet with Certificate Management

apiVersion: v1
kind: Service
metadata:
  name: cassandra
  namespace: cassandra
spec:
  clusterIP: None
  selector:
    app: cassandra
  ports:
  - port: 9042
    name: cql
  - port: 7000
    name: inter-node
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: cassandra
  namespace: cassandra
spec:
  serviceName: cassandra
  replicas: 3
  selector:
    matchLabels:
      app: cassandra
  template:
    metadata:
      labels:
        app: cassandra
    spec:
      initContainers:
      - name: setup-certs
        image: busybox:1.36
        command:
        - sh
        - -c
        - |
          # Convert cert-manager certificates to Java format
          cp /tls/tls.crt /certs/node-cert.pem
          cp /tls/tls.key /certs/node-key.pem
          cp /tls/ca.crt /certs/ca-cert.pem
          chmod 600 /certs/*          
        volumeMounts:
        - name: cert-manager-tls
          mountPath: /tls
        - name: certs
          mountPath: /certs
      containers:
      - name: cassandra
        image: cassandra:5.0
        ports:
        - containerPort: 9042
          name: cql
        - containerPort: 7000
          name: inter-node
        env:
        - name: CASSANDRA_CLUSTER_NAME
          value: "SecureCluster"
        - name: CASSANDRA_DC
          value: "dc1"
        - name: CASSANDRA_RACK
          valueFrom:
            fieldRef:
              fieldPath: metadata.name
        - name: CASSANDRA_SEEDS
          value: "cassandra-0.cassandra.cassandra.svc.cluster.local"
        - name: POD_IP
          valueFrom:
            fieldRef:
              fieldPath: status.podIP
        volumeMounts:
        - name: data
          mountPath: /var/lib/cassandra
        - name: certs
          mountPath: /etc/cassandra/certs
          readOnly: true
        - name: config
          mountPath: /etc/cassandra/cassandra.yaml
          subPath: cassandra.yaml
        resources:
          requests:
            memory: "4Gi"
            cpu: "2"
          limits:
            memory: "8Gi"
            cpu: "4"
        livenessProbe:
          exec:
            command:
            - /bin/bash
            - -c
            - |
              cqlsh --ssl -e "SELECT now() FROM system.local" || exit 1              
          initialDelaySeconds: 90
          periodSeconds: 30
        readinessProbe:
          exec:
            command:
            - /bin/bash
            - -c
            - |
              cqlsh --ssl -e "SELECT now() FROM system.local" || exit 1              
          initialDelaySeconds: 60
          periodSeconds: 10
      volumes:
      - name: cert-manager-tls
        secret:
          secretName: cassandra-node-tls
      - name: certs
        emptyDir: {}
      - name: config
        configMap:
          name: cassandra-config
  volumeClaimTemplates:
  - metadata:
      name: data
    spec:
      accessModes: ["ReadWriteOnce"]
      storageClassName: fast-ssd
      resources:
        requests:
          storage: 100Gi

ConfigMap for Cassandra Configuration

apiVersion: v1
kind: ConfigMap
metadata:
  name: cassandra-config
  namespace: cassandra
data:
  cassandra.yaml: |
    cluster_name: 'SecureCluster'
    num_tokens: 256
    allocate_tokens_for_local_replication_factor: 3
    seed_provider:
      - class_name: org.apache.cassandra.locator.SimpleSeedProvider
        parameters:
          - seeds: "cassandra-0.cassandra.cassandra.svc.cluster.local"
    endpoint_snitch: GossipingPropertyFileSnitch
    
    # SSL Configuration
    client_encryption_options:
      enabled: true
      optional: false
      keystore: /etc/cassandra/certs/keystore.p12
      keystore_password: cassandra
      keystore_type: PKCS12
      truststore: /etc/cassandra/certs/truststore.jks
      truststore_password: cassandra
      truststore_type: PKCS12
      protocol: TLSv1.3
      cipher_suites:
        - TLS_AES_256_GCM_SHA384
        - TLS_AES_128_GCM_SHA256
      require_client_auth: true
      enable_certificate_reload: true
      
    server_encryption_options:
      internode_encryption: all
      keystore: /etc/cassandra/certs/keystore.p12
      keystore_password: cassandra
      keystore_type: PKCS12
      truststore: /etc/cassandra/certs/truststore.jks
      truststore_password: cassandra
      truststore_type: PKCS12
      protocol: TLSv1.3
      cipher_suites:
        - TLS_AES_256_GCM_SHA384
        - TLS_AES_128_GCM_SHA256
      require_client_auth: true
      enable_certificate_reload: true    

Client Configuration

Modern cqlsh Configuration

# ~/.cassandra/cqlshrc
[connection]
hostname = cassandra-0.cassandra.svc.cluster.local
port = 9042
ssl = true

[ssl]
validate = true
certfile = ~/certs/ca-cert.pem
userkey = ~/certs/client-key.pem
usercert = ~/certs/client-cert.pem
version = TLSv1.3

Python Driver with SSL (5.x)

from cassandra.cluster import Cluster
from cassandra.auth import PlainTextAuthProvider
from ssl import SSLContext, PROTOCOL_TLS_CLIENT, CERT_REQUIRED

# Create SSL context with TLS 1.3
ssl_context = SSLContext(PROTOCOL_TLS_CLIENT)
ssl_context.minimum_version = ssl.TLSVersion.TLSv1_3
ssl_context.check_hostname = True
ssl_context.verify_mode = CERT_REQUIRED

# Load certificates
ssl_context.load_cert_chain(
    certfile='client-cert.pem',
    keyfile='client-key.pem'
)
ssl_context.load_verify_locations('ca-cert.pem')

# Connect with authentication
auth_provider = PlainTextAuthProvider(
    username='cassandra',
    password='cassandra'
)

cluster = Cluster(
    ['cassandra-0.cassandra.svc.cluster.local'],
    ssl_context=ssl_context,
    auth_provider=auth_provider,
    protocol_version=5  # Cassandra 5.0 uses protocol v5
)

session = cluster.connect()

# Test connection
result = session.execute("SELECT release_version FROM system.local")
print(f"Connected to Cassandra {result.one().release_version}")

Java Driver Configuration

import com.datastax.oss.driver.api.core.CqlSession;
import com.datastax.oss.driver.api.core.config.DriverConfigLoader;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManagerFactory;
import javax.net.ssl.KeyManagerFactory;
import java.io.FileInputStream;
import java.security.KeyStore;
import java.net.InetSocketAddress;

public class SecureCassandraClient {
    public static void main(String[] args) throws Exception {
        // Load keystore and truststore
        KeyStore keyStore = KeyStore.getInstance("PKCS12");
        keyStore.load(new FileInputStream("client.p12"), "cassandra".toCharArray());
        
        KeyStore trustStore = KeyStore.getInstance("JKS");
        trustStore.load(new FileInputStream("truststore.jks"), "cassandra".toCharArray());
        
        // Create SSL context
        KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
        kmf.init(keyStore, "cassandra".toCharArray());
        
        TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
        tmf.init(trustStore);
        
        SSLContext sslContext = SSLContext.getInstance("TLSv1.3");
        sslContext.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
        
        // Create session with SSL
        CqlSession session = CqlSession.builder()
            .addContactPoint(new InetSocketAddress("cassandra-0.cassandra.svc.cluster.local", 9042))
            .withSslContext(sslContext)
            .withAuthCredentials("cassandra", "cassandra")
            .withLocalDatacenter("dc1")
            .build();
        
        // Test connection
        session.execute("SELECT release_version FROM system.local")
            .one()
            .getString("release_version");
        
        System.out.println("Connected to secure Cassandra cluster");
        session.close();
    }
}

Certificate Automation

Cert-Manager Auto-Renewal Script

#!/bin/bash
# refresh-certs.sh - Automatically refresh certificates

# Function to convert cert-manager certs to Java format
convert_certs() {
    # Wait for cert-manager to update certificates
    while [ ! -f /tls/tls.crt ] || [ ! -f /tls/tls.key ]; do
        echo "Waiting for certificates..."
        sleep 5
    done

    # Convert to PKCS12
    openssl pkcs12 -export \
        -in /tls/tls.crt \
        -inkey /tls/tls.key \
        -out /etc/cassandra/certs/keystore.p12 \
        -name cassandra \
        -CAfile /tls/ca.crt \
        -caname "Cassandra CA" \
        -password pass:cassandra

    # Create truststore
    keytool -import -file /tls/ca.crt \
        -alias cassandra-ca \
        -keystore /etc/cassandra/certs/truststore.jks \
        -storepass cassandra \
        -noprompt \
        -storetype PKCS12

    # Signal Cassandra to reload certificates (Cassandra 5.0 feature)
    nodetool reloadssl
}

# Monitor certificate changes
inotifywait -m -e modify,create /tls/ |
while read -r directory events filename; do
    if [[ "$filename" == "tls.crt" ]] || [[ "$filename" == "tls.key" ]]; then
        echo "Certificate change detected, converting..."
        convert_certs
        echo "Certificates reloaded successfully"
    fi
done

HashiCorp Vault Integration

# vault-cassandra-pki.hcl
path "pki/issue/cassandra" {
  capabilities = ["create", "update"]
}

path "pki/cert/ca" {
  capabilities = ["read"]
}
#!/bin/bash
# vault-cert-rotation.sh

# Login to Vault
export VAULT_TOKEN=$(vault login -token-only -method=kubernetes)

# Generate new certificate
vault write -format=json pki/issue/cassandra \
    common_name="cassandra-$(hostname)" \
    ttl="720h" \
    alt_names="localhost,$(hostname).cassandra.svc.cluster.local" \
    ip_sans="127.0.0.1,$(hostname -i)" > cert.json

# Extract certificates
jq -r '.data.certificate' cert.json > /etc/cassandra/certs/node-cert.pem
jq -r '.data.private_key' cert.json > /etc/cassandra/certs/node-key.pem
jq -r '.data.ca_chain[]' cert.json > /etc/cassandra/certs/ca-cert.pem

# Convert to Java format
openssl pkcs12 -export \
    -in /etc/cassandra/certs/node-cert.pem \
    -inkey /etc/cassandra/certs/node-key.pem \
    -out /etc/cassandra/certs/keystore.p12 \
    -name cassandra \
    -password pass:cassandra

# Reload certificates
nodetool reloadssl

Security Best Practices

1. Network Policies

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: cassandra-network-policy
  namespace: cassandra
spec:
  podSelector:
    matchLabels:
      app: cassandra
  policyTypes:
  - Ingress
  - Egress
  ingress:
  - from:
    - podSelector:
        matchLabels:
          app: cassandra
    ports:
    - protocol: TCP
      port: 7000  # Inter-node communication
    - protocol: TCP
      port: 7001  # Inter-node SSL
  - from:
    - podSelector:
        matchLabels:
          app: cassandra-client
    - namespaceSelector:
        matchLabels:
          name: application
    ports:
    - protocol: TCP
      port: 9042  # CQL
  egress:
  - to:
    - podSelector:
        matchLabels:
          app: cassandra
    ports:
    - protocol: TCP
      port: 7000
    - protocol: TCP
      port: 7001

2. RBAC Configuration

apiVersion: v1
kind: ServiceAccount
metadata:
  name: cassandra
  namespace: cassandra
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: cassandra-role
  namespace: cassandra
rules:
- apiGroups: [""]
  resources: ["pods", "services"]
  verbs: ["get", "list", "watch"]
- apiGroups: [""]
  resources: ["secrets"]
  resourceNames: ["cassandra-node-tls"]
  verbs: ["get"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: cassandra-rolebinding
  namespace: cassandra
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: cassandra-role
subjects:
- kind: ServiceAccount
  name: cassandra
  namespace: cassandra

3. Pod Security Standards

apiVersion: v1
kind: Pod
metadata:
  name: cassandra-secure
spec:
  securityContext:
    runAsNonRoot: true
    runAsUser: 999
    fsGroup: 999
    seccompProfile:
      type: RuntimeDefault
  containers:
  - name: cassandra
    image: cassandra:5.0
    securityContext:
      allowPrivilegeEscalation: false
      readOnlyRootFilesystem: true
      capabilities:
        drop:
        - ALL
        add:
        - NET_BIND_SERVICE
    volumeMounts:
    - name: data
      mountPath: /var/lib/cassandra
    - name: tmp
      mountPath: /tmp
    - name: var-log
      mountPath: /var/log/cassandra

Monitoring and Troubleshooting

Prometheus Metrics with SSL

apiVersion: v1
kind: ConfigMap
metadata:
  name: prometheus-cassandra-config
data:
  prometheus.yml: |
    global:
      scrape_interval: 15s
    scrape_configs:
    - job_name: 'cassandra'
      scheme: https
      tls_config:
        ca_file: /etc/prometheus/certs/ca.crt
        cert_file: /etc/prometheus/certs/tls.crt
        key_file: /etc/prometheus/certs/tls.key
      static_configs:
      - targets:
        - cassandra-0.cassandra:7070
        - cassandra-1.cassandra:7070
        - cassandra-2.cassandra:7070    

SSL Debugging Commands

# Check certificate validity
openssl x509 -in /etc/cassandra/certs/node-cert.pem -text -noout

# Verify certificate chain
openssl verify -CAfile ca-cert.pem node-cert.pem

# Test SSL connection
openssl s_client -connect cassandra-0:9042 -tls1_3 -showcerts

# Check Cassandra SSL status
nodetool info | grep -i ssl

# View SSL handshake logs
nodetool setlogginglevel org.apache.cassandra.transport TRACE

# Monitor certificate expiration
kubectl get certificate -n cassandra -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.status.notAfter}{"\n"}{end}'

# Check cipher suites in use
cqlsh --ssl --debug

Common SSL Issues and Solutions

  1. Certificate Verification Failed

    # Check DNS names in certificate
    openssl x509 -in cert.pem -text | grep -A1 "Subject Alternative Name"
    
    # Ensure hostname matches certificate
    hostname -f
    
  2. Handshake Failure

    # Check supported protocols
    openssl s_client -connect host:9042 -tls1_3
    
    # Verify cipher suites
    nmap --script ssl-enum-ciphers -p 9042 cassandra-host
    
  3. Performance Impact

    # Enable native transport encryption offloading
    native_transport_flush_in_batches: true
    native_transport_max_concurrent_requests_in_bytes: 134217728
    

Performance Optimization

JVM SSL Tuning

# cassandra-env.sh additions
JVM_OPTS="$JVM_OPTS -Djdk.tls.server.protocols=TLSv1.3"
JVM_OPTS="$JVM_OPTS -Djdk.tls.client.protocols=TLSv1.3"
JVM_OPTS="$JVM_OPTS -Djdk.tls.ephemeralDHKeySize=2048"
JVM_OPTS="$JVM_OPTS -Dcom.sun.net.ssl.enableECC=true"
JVM_OPTS="$JVM_OPTS -Djsse.enableSNIExtension=true"

# Enable hardware acceleration if available
JVM_OPTS="$JVM_OPTS -XX:+UseAES -XX:+UseAESIntrinsics"

Connection Pooling

# Optimized Python client with connection pooling
from cassandra.cluster import Cluster
from cassandra.policies import DCAwareRoundRobinPolicy
from cassandra.connection import Connection

# Increase SSL handshake timeout
Connection.ssl_handshake_timeout = 10.0

cluster = Cluster(
    contact_points=['cassandra-0.cassandra'],
    ssl_context=ssl_context,
    protocol_version=5,
    load_balancing_policy=DCAwareRoundRobinPolicy(local_dc='dc1'),
    # Connection pooling settings
    connection_pool_size=10,
    max_connection_attempts=3,
    reconnection_policy=ConstantReconnectionPolicy(delay=1.0)
)

Conclusion

This guide has covered modern SSL/TLS setup for Cassandra 5.0 clusters with emphasis on:

  • Security First: TLS 1.3, mTLS, and zero-trust principles
  • Automation: Certificate management with cert-manager and Vault
  • Cloud Native: Kubernetes deployment with proper RBAC and network policies
  • Observability: Monitoring SSL metrics and debugging tools
  • Performance: Optimized configurations for production workloads

Remember to regularly update certificates, monitor expiration dates, and keep Cassandra and SSL libraries up to date for optimal security.

References

                                                                           
comments powered by Disqus

Apache Spark Training
Kafka Tutorial
Akka Consulting
Cassandra Training
AWS Cassandra Database Support
Kafka Support Pricing
Cassandra Database Support Pricing
Non-stop Cassandra
Watchdog
Advantages of using Cloudurable™
Cassandra Consulting
Cloudurable™| Guide to AWS Cassandra Deploy
Cloudurable™| AWS Cassandra Guidelines and Notes
Free guide to deploying Cassandra on AWS
Kafka Training
Kafka Consulting
DynamoDB Training
DynamoDB Consulting
Kinesis Training
Kinesis Consulting
Kafka Tutorial PDF
Kubernetes Security Training
Redis Consulting
Redis Training
ElasticSearch / ELK Consulting
ElasticSearch Training
InfluxDB/TICK Training TICK Consulting