Files
f25343d281 chore(tests): Add comprehensive TLS tests and example (#3681)
* chore(tests): add tls tests

* fix: Use ShardPicker for keyless commands instead of random slot

- cmdSlot now returns -1 for keyless commands instead of RandomSlot()
- This allows cmdNodeWithShardPicker to use the configured ShardPicker
  (default: RoundRobinPicker) for keyless command routing
- Updated mapCmdsByNode to handle slot == -1 by using ShardPicker
- Updated test to verify round robin distribution works correctly

* chore(image): update clients-test-lib image

* chore(tests): enable tls user auth test

* chore(docker): use proper envs for test image

* chore(image): use latest build

* chore(image): use latest build

* fix(tests): use the correct root cert

* feat(tls): add example app

* chore(docker): address pr comments

* chore(tests): address pr comments

* chore(doc): add README.md in the example app

* fix(tests): do not skip tests

* fix(tests): skip only because of redis version

* Extracts default image name in a var (including osscluster-tls)

Signed-off-by: Elena Kolevska <[email protected]>

* fix(tlstests): remove redundent test

---------

Signed-off-by: Elena Kolevska <[email protected]>
Co-authored-by: Elena Kolevska <[email protected]>
2026-02-12 15:26:00 +02:00

2.1 KiB

TLS Certificate Authentication Example

This example demonstrates how to use TLS client certificates for automatic authentication with Redis 8.6+.

When Redis is configured with tls-auth-clients-user CN, it uses the Common Name (CN) field from the client certificate as the username, eliminating the need for password-based authentication.

Prerequisites

  • Redis 8.6+ with TLS enabled
  • Redis configured with: tls-auth-clients-user CN
  • Client certificate with CN matching a Redis ACL user
  • The ACL user must exist and have nopass set

How It Works

  1. Load CA certificate - Used to verify the Redis server's certificate
  2. Load client certificate - The CN field must match a Redis ACL username
  3. Connect with TLS - No username/password needed in the connection options
  4. Redis authenticates automatically - Based on the certificate's CN field

Running the Example

# Start Redis with TLS (from the go-redis root directory)
docker compose --profile standalone up -d

# Run the example
cd example/tls-cert-auth
go run main.go

Expected Output

✅ Authenticated as: testcertuser (via TLS certificate CN)
✅ SET/GET successful: hello from cert auth!

🎉 TLS certificate authentication working!

Docker Configuration

The go-redis test environment is configured with these environment variables:

environment:
  - TLS_ENABLED=yes
  - TLS_CLIENT_CNS=testcertuser      # Generates testcertuser.{crt,key}
  - TLS_AUTH_CLIENTS_USER=CN         # Enables CN-based authentication

Key Code

// Load client certificate (CN must match Redis ACL username)
clientCert, err := tls.LoadX509KeyPair(
    "testcertuser.crt",
    "testcertuser.key",
)

// Create TLS config
tlsConfig := &tls.Config{
    RootCAs:      caCertPool,
    Certificates: []tls.Certificate{clientCert},
}

// Connect - NO username/password needed!
client := redis.NewClient(&redis.Options{
    Addr:      "localhost:6666",
    TLSConfig: tlsConfig,
})

Fallback Behavior

If the certificate CN doesn't match any existing ACL user, Redis falls back to the default user. See tls_cert_auth_test.go for tests covering both scenarios.