Cách sửa lỗi Redis ssl.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] unable to get local issuer certificate

intermediate🔴 Redis2026-07-26| Python 3.8+, redis-py 4.0+, Redis 6.0+ với TLS, AWS ElastiCache, Azure Cache for Redis, hoặc Redis tự cài đặt.

Error Message

ssl.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1123)
#redis#python#ssl#tls#devops#aws

Vấn đề

Bạn đang cố gắng kết nối với một thực thể Redis qua TLS? Bạn có thể gặp phải một thông báo lỗi (traceback) khó chịu như thế này:

ssl.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1123)

Lỗi này xảy ra khi ứng dụng Python của bạn cố gắng xác minh danh tính của máy chủ Redis nhưng thất bại. Về cơ bản, client của bạn nhìn thấy chứng chỉ SSL nhưng không nhận diện được cơ quan cấp chứng chỉ (CA) đã ký nó. Nếu không có liên kết đáng tin cậy đến một chứng chỉ gốc (root certificate) trong kho lưu trữ cục bộ, kết nối sẽ bị ngắt vì lý do bảo mật.

Tại sao việc xác minh thất bại

Quá trình bắt tay SSL (SSL handshake) thất bại vì một vài lý do cụ thể. Một nguyên nhân phổ biến là Thiếu CA Bundle. Client của bạn có thể không biết các tệp Certificate Authority (CA) gốc nằm ở đâu trên đĩa cứng.

Nếu bạn sử dụng Chứng chỉ tự ký (Self-Signed Certificates) để kiểm thử nội bộ, client của bạn sẽ từ chối chúng theo mặc định. Các dịch vụ được quản lý như AWS ElastiCache hoặc Azure Cache for Redis cũng sử dụng các CA cụ thể. Những chứng chỉ này có thể không tồn tại trong kho lưu trữ tin cậy mặc định của môi trường. Cuối cùng, Python trên macOS thường xuyên gặp vấn đề này. Nó thường sử dụng gói chứng chỉ nội bộ riêng thay vì keychain của hệ thống.

Các bước khắc phục

1. Trỏ đến chứng chỉ CA một cách thủ công

Việc trỏ client trực tiếp đến tệp CA đáng tin cậy là cách khắc phục đáng tin cậy nhất cho môi trường production. Điều này thường thấy khi sử dụng AWS ElastiCache, nơi thường yêu cầu tệp amazon-trust-services.pem.

import redis

# Ví dụ: Đường dẫn đến chứng chỉ CA đã tải xuống
ca_cert_path = "/etc/ssl/certs/redis-ca.pem"

r = redis.Redis(
    host='cum-redis-cua-ban.cache.amazonaws.com',
    port=6379,
    ssl=True,
    ssl_ca_certs=ca_cert_path,
    password='mat-khau-bao-mat-cua-ban'
)

# Nếu thành công, lệnh này trả về True
print(r.ping())

2. Sử dụng thư viện Certifi

Hầu hết các CA công khai đã được thư viện certifi theo dõi. Đây là tiêu chuẩn vàng để sửa lỗi SSL trên macOS hoặc bên trong các container Docker. Đầu tiên, hãy cài đặt thư viện:

pip install certifi

Sau đó, yêu cầu redis-py sử dụng kho chứng chỉ của certifi:

import redis
import certifi

r = redis.Redis(
    host='host-redis-cua-ban',
    port=6379,
    ssl=True,
    ssl_ca_certs=certifi.where()
)

print(r.ping())

3. Cập nhật chứng chỉ ở cấp độ hệ điều hành

Đôi khi nguyên nhân gốc rễ là do hệ điều hành đã lỗi thời. Nếu kho lưu trữ cục bộ của bạn đã cũ, nó sẽ không nhận diện được các chứng chỉ mới từ các nhà cung cấp như Let's Encrypt.

Trên Ubuntu/Debian:

sudo apt-get update
sudo apt-get install --reinstall ca-certificates
sudo update-ca-certificates

Trên macOS: Nếu bạn cài đặt Python 3.11 hoặc 3.12 thông qua trình cài đặt chính thức, bạn phải chạy tập lệnh đi kèm để cài đặt chứng chỉ. Thay thế 3.x bằng phiên bản thực tế của bạn:

/Applications/Python\ 3.x/Install\ Certificates.command

4. Vô hiệu hóa xác minh (Chỉ dành cho môi trường phát triển)

Bạn đang làm việc trên máy phát triển cục bộ? Bạn có thể bỏ qua hoàn toàn việc kiểm tra. Không bao giờ làm điều này trong môi trường production vì nó khiến kết nối của bạn dễ bị tấn công xen giữa (man-in-the-middle).

import redis
import ssl

r = redis.Redis(
    host='localhost',
    port=6379,
    ssl=True,
    ssl_cert_reqs=None # Bỏ qua xác thực
)

print(r.ping())

Kiểm tra kết nối

Chạy một lệnh PING đơn giản. Nếu client trả về PONG, quá trình bắt tay TLS của bạn đang hoạt động hoàn hảo. Nếu bạn vẫn gặp sự cố, hãy thử kiểm tra bằng redis-cli để xem vấn đề có phải do Python hay không:

# Kiểm tra bằng redis-cli
redis-cli -h host-cua-ban -p 6379 --tls --cacert /duong-dan/den/ca.pem ping

Cách ngăn ngừa lỗi trong tương lai

  • Tự động cập nhật: Chạy pip install --upgrade certifi hàng tháng để giữ cho các gợi ý gốc luôn mới.
  • Theo dõi ngày hết hạn: Chứng chỉ thường hết hạn sau mỗi 90 ngày. Hãy thiết lập cảnh báo để gia hạn trước khi chúng làm gián đoạn ứng dụng của bạn.
  • Tập trung hóa cấu hình: Sử dụng các biến môi trường như REDIS_CA_PATH thay vì viết cứng (hardcoding) các chuỗi ký tự trong tập lệnh của bạn.

Related Error Notes