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ànapt-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 quagpg --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ế.

