Sửa lỗi 'gpg: keyserver receive failed: General error' Khi Thêm GPG Key trên Ubuntu/Debian

intermediate🐧 Linux2026-05-04| Ubuntu 20.04/22.04/24.04, Debian 11/12, khi chạy apt-key adv hoặc gpg --keyserver

Error Message

gpg: keyserver receive failed: General error
#gpg#apt#keyserver#ubuntu#debian#repository

Lỗi Gặp Phải

Bạn đang thêm repository apt của bên thứ ba — Docker, Kubernetes, Spotify, hay bất kỳ thứ gì — và chạy lệnh:

sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys ABCDEF1234567890

Lệnh treo 30–60 giây, rồi hiện ra thông báo:

gpg: keyserver receive failed: General error

Đôi khi thông báo lỗi có hơi khác một chút:

gpg: keyserver receive failed: No keyserver available
gpg: keyserver receive failed: Connection refused

Dù thông báo nào đi nữa, việc cài đặt gói của bạn đều bị chặn. Dưới đây là cách xử lý.

Nguyên Nhân

Mỗi nguyên nhân cần cách sửa khác nhau, vì vậy hãy xác định xem bạn đang gặp trường hợp nào:

  • Keyserver bị tắt hoặc không thể kết nối — keyserver.ubuntu.com thỉnh thoảng ngoại tuyến, đôi khi kéo dài vài tiếng
  • Cổng 11371 bị chặn — tường lửa, proxy công ty, hoặc nhà cung cấp VPS chặn cổng HKP 11371 hướng ra ngoài
  • Phân giải DNS thất bại — tên máy chủ keyserver không phân giải được từ mạng của bạn
  • Phiên bản GPG không tương thích — các phiên bản GPG cũ gặp sự cố bắt tay TLS với keyserver hiện đại
  • Quy trình apt-key đã lỗi thời — Ubuntu 22.04+ đã khai tử hoàn toàn apt-key adv; đây không còn là công cụ phù hợp nữa

Cách Sửa 1: Chuyển Sang Keyserver Khác

Phương án nhanh nhất lúc 2 giờ sáng: thử keyserver khác. Keyserver của Ubuntu nổi tiếng hay gặp sự cố. MIT và OpenPGP.org hoạt động ổn định hơn khi tải cao.

# Thử keyserver MIT
sudo apt-key adv --keyserver hkp://pgp.mit.edu:80 --recv-keys YOUR_KEY_ID

# Hoặc OpenPGP.org
sudo apt-key adv --keyserver hkp://keys.openpgp.org:80 --recv-keys YOUR_KEY_ID

# Hoặc Ubuntu qua cổng 80 (vượt qua tường lửa chặn cổng 11371)
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys YOUR_KEY_ID

Phần :80 ở cuối rất quan trọng. Nó buộc kết nối đi qua cổng HTTP 80 thay vì cổng HKP 11371. Trên các mạng chặn cổng 11371, chỉ riêng điều này đã giải quyết được vấn đề.

Cách Sửa 2: Tải Key Trực Tiếp Qua curl

Loại bỏ keyserver khỏi quy trình. Hầu hết các nhà quản trị repository đều công bố GPG key tại một URL trực tiếp — Docker, HashiCorp, GitHub CLI, tất cả đều làm vậy. Tải thẳng từ nguồn:

# Cách 1: curl vào apt-key (Ubuntu/Debian cũ hơn)
curl -fsSL https://example.com/repo-key.gpg | sudo apt-key add -

# Cách 2: Phương pháp hiện đại (Ubuntu 22.04+)
curl -fsSL https://example.com/repo-key.gpg | sudo gpg --dearmor -o /usr/share/keyrings/repo-name.gpg

Sau đó tham chiếu key trong mục sources.list của bạn:

echo "deb [signed-by=/usr/share/keyrings/repo-name.gpg] https://repo.example.com stable main" | sudo tee /etc/apt/sources.list.d/repo-name.list

Tài liệu chính thức của Docker sử dụng đúng pattern này:

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

Cách Sửa 3: Dùng gpg Trực Tiếp Với hkps://

Khi apt-key adv liên tục gặp lỗi, hãy bỏ qua nó và gọi gpg trực tiếp với hỗ trợ keyserver HTTPS:

gpg --keyserver hkps://keys.openpgp.org --recv-keys YOUR_KEY_ID

Xuất key và chuyển cho apt:

gpg --export YOUR_KEY_ID | sudo apt-key add -

# Hoặc theo cách hiện đại:
gpg --export YOUR_KEY_ID | sudo gpg --dearmor -o /usr/share/keyrings/repo-name.gpg

Cách Sửa 4: Khi Đứng Sau Proxy Công Ty

Mạng công ty có HTTP proxy là nguyên nhân phổ biến. Daemon dirmngr của GPG không tự động nhận cấu hình proxy — bạn phải thiết lập thủ công.

Thêm nội dung sau vào ~/.gnupg/dirmngr.conf:

keyserver hkps://keys.openpgp.org
honor-http-proxy

Sau đó đặt biến môi trường proxy và khởi động lại dirmngr:

export http_proxy=http://proxy.company.com:3128
export https_proxy=http://proxy.company.com:3128

gpgconf --kill dirmngr
gpg --keyserver hkps://keys.openpgp.org --recv-keys YOUR_KEY_ID

Cách Sửa 5: Tường Lửa Chặn Toàn Bộ Lưu Lượng Keyserver

Một số nhà cung cấp VPS — Oracle Cloud Free Tier và một số cấu hình Hetzner chẳng hạn — mặc định chặn tất cả lưu lượng ra ngoài đến các cổng keyserver. Không có keyserver nào hoạt động được từ những máy đó.

Cách khắc phục: tải key trên một máy không bị hạn chế, rồi sao chép sang.

# Trên máy LOCAL của bạn:
gpg --keyserver keyserver.ubuntu.com --recv-keys YOUR_KEY_ID
gpg --export --armor YOUR_KEY_ID > repo-key.asc
scp repo-key.asc user@your-server:/tmp/

# Trên SERVER:
sudo apt-key add /tmp/repo-key.asc
# Hoặc theo cách hiện đại:
sudo gpg --dearmor -o /usr/share/keyrings/repo-name.gpg /tmp/repo-key.asc

Cách Sửa 6: Cài Lại gnupg và dirmngr

Nâng cấp hệ thống không hoàn chỉnh và các lần di chuyển bị lỗi có thể để lại chuỗi công cụ GPG ở trạng thái hỏng — quyền sai, file socket cũ, cơ sở dữ liệu keyring bị hỏng. Cài lại sạch thường khắc phục được:

sudo apt-get remove --purge gpg gpg-agent dirmngr
sudo apt-get install gnupg2 gnupg-agent dirmngr

# Xóa trạng thái cũ
rm -rf ~/.gnupg
gpg --list-keys  # Tạo lại ~/.gnupg với quyền đúng

Sau đó thử lại lệnh import key ban đầu.

Kiểm Tra Kết Quả

Sau khi đã import key, xác nhận rằng key đã thực sự có mặt:

# Cách cũ
sudo apt-key list

# Cách mới (Ubuntu 22.04+)
ls -la /usr/share/keyrings/
gpg --show-keys /usr/share/keyrings/repo-name.gpg

Chạy sudo apt update. Đầu ra sạch trông như thế này — không có cảnh báo NO_PUBKEY, không có lỗi GPG:

sudo apt update
# Mong đợi: chỉ có các dòng "Hit:" hoặc "Get:"

Phòng Ngừa

Hãy loại bỏ apt-key adv --keyserver khỏi các playbook và script thiết lập của bạn. Quy trình keyserver đã bị khai tử trong Ubuntu 22.04+ và không đáng tin cậy ở mọi nơi. Pattern thay thế gồm ba bước:

  • Tải key từ URL chính thức của repository bằng curl
  • Lưu vào /usr/share/keyrings/ thông qua gpg --dearmor
  • Tham chiếu tường minh bằng signed-by= trong mục sources.list

Không phụ thuộc keyserver đồng nghĩa với việc hoạt động được trong môi trường air-gapped, không bị ảnh hưởng khi keyserver gặp sự cố, và chạy ổn định trong các pipeline CI/CD nơi quyền truy cập mạng bị hạn chế.

Related Error Notes