Configuring SSL for Node-to-Node Connections
Node-to-node (internode) encryption protects data in-flight between nodes in a cluster using SSL.
Prerequisites
Create SSL certificates, keystores, and truststores. You can either create local keystore files or use a remote keystore provider.
OpsCenter Lifecycle Manager can configure DataStax Enterprise clusters to use node-to-node encryption and automates the process of preparing server certificates using an internal certificate authority and deploys the resulting keystore and truststore to each node automatically.
Procedure
-
Locate the
cassandra.yaml
file. The location of this file depends on the type of installation:-
Package installations:
/etc/dse/cassandra/cassandra.yaml
-
Tarball installations:
<installation_location>/resources/cassandra/conf/cassandra.yaml
-
-
Edit
cassandra.yaml
and make the following changes to theserver_encryption_options
section to enable SSL:-
Set
internode_encryption
to one of the following options to limit which traffic between nodes is encrypted:-
all - Encrypt all internode communications.
-
none - No encryption.
-
dc - Encrypt the traffic between the datacenters.
-
rack - Encrypt the traffic between the racks.
-
-
Set
require_client_auth
totrue
to require two-way host certificate validation. -
Set
require_endpoint_verification
totrue
to verify that the connected node’s IP address matches the certificate.
-
-
Configure the keystore and truststore, depending on whether you are using local keystore files or a remote keystore provider. All settings are configured in the
server_encryption_options
section ofcassandra.yaml
.-
Local files
-
Remote provider
Use the following settings:
server_encryption_options: internode_encryption: all keystore_type: JKS keystore: <path_to_keystore.jks> keystore_password: <keystore_password> require_client_auth: true require_endpoint_verification: true truststore_type: JKS truststore: <path_to_truststore.jks> truststore_password: <truststore_password>
To encrypt the truststore and keystore passwords for local encryption, see Encrypting configuration file properties. For
KMIP
see Encrypting configuration file properties.Use the following settings. Unused options can be blank or commented out.
Requires installation of a provider.
server_encryption_options: internode_encryption: all keystore_type: PKCS12 require_client_auth: true require_endpoint_verification: true truststore_type: PKCS12
Encryption options for internode communication using the
TLS_RSA_WITH_AES_128_CBC_SHA
cipher suite for authentication, key exchange, and encryption of data transfers. Use theDHE/ECDHE
ciphers, such asTLS_DHE_RSA_WITH_AES_128_CBC_SHA
, if running in Federal Information Processing Standard (FIPS) 140 compliant mode.- keystore_type
-
Valid types are
JKS
,JCEKS
,PKCS11
, orPKCS12
. For file-based keystores, usePKCS12
.DataStax supports
PKCS11
as akeystore_type
on nodes withcassandra
oradvanced
workloads. Theadvanced
workload support was added for DSE 6.8.2 and later. IfPKCS11
is needed, inserver_encryption_options
orclient_encryption_options
, specify thekeystore_type
asPKCS11
and thekeystore
asNONE
.PKCS11
is not supported as atruststore_type.
Default:
JKS
- keystore
-
Relative path from the DSE installation directory or the absolute path to the Java keystore (JKS) suitable for use with Java Secure Socket Extension (JSSE). JSSE is the Java version of the Secure Sockets Layer (SSL), and Transport Layer Security (TLS) protocols. The keystore contains the private key used to encrypt outgoing messages.
Default:
resources/dse/conf/.keystore
- keystore_password
-
Password for the keystore. This must match the password used when generating the keystore and truststore.
Default: cassandra
- require_client_auth
-
Enables certificate authentication for node-to-node (internode) encryption.
Default: false
- require_endpoint_verification
-
Whether to verify the connected host and the host IP address in the certificate match. If set to
true
, then the endpoint that you specify when generating the certificate key must be an IP address. Do not specify a DNS hostname. Example with a correctly specified IP address:keytool -genkeypair -keyalg RSA \ -alias node0 \ -keystore my_keystore.jks \ -storepass cassandra \ -keypass cassandra \ -validity 730 \ -keysize 2048 \ -dname "CN=node0, OU=lacerda-ssl, O=Datastax, C=CC" \ -ext "san=ip:10.101.35.236"
Default: false
- truststore_type
-
Valid types are
JKS
,JCEKS
,PKCS12
. For file-based truststores, usePKCS12
.Due to an OpenSSL issue, you cannot use a PKCS12 truststore that was generated via OpenSSL. For example, a truststore generated via the following command will not work with DSE:
openssl pkcs12 -export -nokeys -out truststore.pfx -in <intermediate.chain.pem>
However, truststores generated via Java’s
keytool
and then converted to PKCS12 work with DSE. Example:keytool -importcert -alias <rootca> -file <rootca.pem> -keystore <truststore.jks>
keytool -importcert -alias <intermediate> -file <intermediate.pem> -keystore <truststore.jks>
keytool -importkeystore -srckeystore <truststore.jks> -destkeystore <truststore.pfx> -deststoretype pkcs12
Default:
JKS
- truststore
-
Relative path from the DSE installation directory or the absolute path to truststore containing the trusted certificate for authenticating remote servers.
Default:
resources/dse/conf/.truststore
- truststore_password
-
Password for the truststore.
Default: cassandra
-
-
Save and close the
cassandra.yaml
file.