Redis TLS: SSL handshake error / protocol mismatch Redis Origin: Data Last updated 5 Nov 2026

Redis: Error: write EPROTO ... SSL routines:ssl3_get_record:wrong version number / Connection reset by peer (TLS vs plaintext)

The client and server disagree about TLS — plaintext client to a TLS port, or TLS client to a plaintext port.

Exact message you may see Error: write EPROTO error:0A00010B:SSL routines::wrong version number redisConnection reset by peer redis TLSError: read ECONNRESET redis ElastiCache in-transit encryptionredis.exceptions.ConnectionError: Error while reading from socket: (104, 'Connection reset by peer')SSL: WRONG_VERSION_NUMBER redis
Seen on: Redis SSL Node.js

Meaning

Managed Redis (ElastiCache in-transit encryption, Azure Cache 6380, Upstash, Redis Cloud) requires TLS: use rediss:// and the right port, or tls: {} option. Self-hosted TLS needs tls-port, certificates, and the CA on the client. Plain clients to a TLS port get "connection reset"/EPROTO.

Common causes

  • redis:// used against a TLS endpoint (needs rediss://)
  • TLS enabled client against plaintext server
  • CA cert not trusted / hostname mismatch
  • Wrong port (6379 vs 6380)
  • Missing tls-auth-clients cert for mTLS

⚡ Quick fix

  1. Use rediss:// and the TLS port
  2. Provide tls: { ca, servername } if using a private CA
  3. Match client and server TLS settings

Detailed fix by platform

Linux

  1. redis-cli --tls -h HOST -p 6380 --cacert ca.crt ping

How to diagnose

  1. Scheme — rediss?
  2. Port — TLS port?
  3. CA — Trusted?

🔧 Still not fixed?

Many errors look alike. If the steps above didn’t solve it, one of these is probably what you’re facing:

Where this error sits

Origin: Data. Errors that are often confused with or caused by this one (click to open):

ActiveRecord::ConnectionNotEstablished — Rails: ActiveRecord::ConnectionNotEstablished: No connection pool for 'ActiveRecord::Base' found (Ruby / Rails)ActiveRecord::Connect…BullMQ: Missing lock for job / job stalled more than allowable limit — BullMQ: Error: Missing lock for job 42. moveToFinished / job stalled more than allowable limit (Redis)BullMQ: Missing lock …BUSY Redis is busy running a script — Redis: (error) BUSY Redis is busy running a script. You can only call SCRIPT KILL or SHUTDOWN NOSAVE (Redis)BUSY Redis is busy ru…ECONNRESET / Connection reset by peer on idle Redis connection — Redis: Error: read ECONNRESET / redis.exceptions.ConnectionError: Connection reset by peer after idle time (Redis)ECONNRESET / Connecti…Error: connect ECONNREFUSED 127.0.0.1:6379 — Redis: Error: connect ECONNREFUSED 127.0.0.1:6379 / Could not connect to Redis at 127.0.0.1:6379: Connection refused (Redis)Error: connect ECONNR…Lettuce: Unable to connect to host (RedisConnectionException) — Spring Data Redis: RedisConnectionFailureException: Unable to connect to Redis; nested exception is io.lettuce.core.RedisConnectionException (Redis)Lettuce: Unable to co…NOAUTH / WRONGPASS invalid username-password pair — Redis: (error) NOAUTH Authentication required. / WRONGPASS invalid username-password pair or user is disabled (Redis)NOAUTH / WRONGPASS in…Redis connection refused (Laravel) — Laravel: Predis\Connection\ConnectionException: Connection refused [tcp://127.0.0.1:6379] / RedisException: Connection refused (Laravel)Redis connection refu…Redis TLS…

Explore the map of this error Full error map →

🧠 Still stuck? Analyze your error

Paste the full message, response headers or stack trace — we'll detect the platform and point to the most likely cause.

💬 What worked for others

No tips yet — did something else fix this for you?

Share what worked for you

Tips are checked by an editor before they appear. Links are removed.