اگر هنگام اجرای sudo apt update در Ubuntu خطای NO_PUBKEY میبینید، APT نتوانسته امضای مخزن را با کلید عمومی مورد اعتماد آن مخزن اعتبارسنجی کند. راه امن این است که مخزن خطادار را دقیقاً شناسایی کنید، اثرانگشت کلید را از منبع رسمی ناشر تأیید کنید و کلید را فقط با Signed-By به همان مخزن محدود کنید. خاموشکردن بررسی امضا یا افزودن کورکورانه کلید از Keyserver راهحل مطمئنی نیست.
این آموزش برای Ubuntu Server، VPS لینوکسی و مخازن شخص ثالث نوشته شده است. اگر خطا مربوط به مخازن رسمی Ubuntu است، بدون بررسی وضعیت بسته ubuntu-keyring و فایل ubuntu.sources، کلید ناشناس جایگزین نکنید.
NO_PUBKEY دقیقاً چه معنایی دارد و با چه خطاهایی فرق میکند؟
نمونه پیام: GPG error: ... The following signatures couldn't be verified because the public key is not available: NO_PUBKEY ABCDEF0123456789. رشته انتهایی شناسه کلید است؛ بهتنهایی برای اعتماد به ناشر کافی نیست. خطای EXPKEYSIG معمولاً به کلید منقضی یا امضای مربوط اشاره میکند، BADSIG از نامعتبر بودن امضا خبر میدهد و 404 Not Found یا Temporary failure resolving مسئله دیگری است. صرف مشاهده NO_PUBKEY به معنی خراب بودن DNS نیست.
پیشنیاز: دسترسی مدیریتی، بکاپ و بررسی شبکه
پیش از ویرایش مخازن، یک نشست SSH فعال نگه دارید و اگر سرور مجازی است دسترسی کنسول یا راه بازیابی را بررسی کنید. برای ثبت وضعیت و نسخه سیستم، دستورهای زیر را اجرا کنید:
cat /etc/os-release
apt --version
sudo cp -a /etc/apt/sources.list.d "/root/apt-sources.list.d.bak-$(date +%F-%H%M%S)"
[ ! -f /etc/apt/sources.list ] || sudo cp -a /etc/apt/sources.list "/root/sources.list.bak-$(date +%F-%H%M%S)"اگر پیش از دریافت فایل امضا خطای DNS یا شبکه دارید، ابتدا عیبیابی DNS در Ubuntu با systemd-resolved را انجام دهید. اگر اتصال مستقیم به IP هم برقرار نیست، راهنمای رفع خطای Network is unreachable و بررسی Route در لینوکس مناسبتر است. این دو خطا را با شکست اعتبارسنجی GPG یکی ندانید.
مرحله ۱: خطای کامل apt update و URL مخزن را ثبت کنید
set -o pipefail
sudo apt update 2>&1 | tee "$HOME/apt-update-no-pubkey.log"در خروجی، دامنه مخزن، توزیع/شاخه (Suite) و شناسه NO_PUBKEY را یادداشت کنید. اگر خروجی را برای پشتیبانی ارسال میکنید، هرگونه نام کاربری، Token یا URL خصوصی مخزن را حذف کنید. دستور apt update فقط فهرست بستهها را بهروزرسانی میکند و نصب یا ارتقای خودکار بستهها نیست.
مرحله ۲: فایل .sources یا .list مسئول مخزن را پیدا کنید
در Ubuntu 24.04 LTS و نسخههای جدیدتر، مخازن اصلی معمولاً در /etc/apt/sources.list.d/ubuntu.sources با قالب deb822 تعریف میشوند. در نسخههای قدیمیتر ممکن است /etc/apt/sources.list و فایلهای .list رایج باشند.
sudo grep -RnsE '^(deb |URIs:|Suites:|Signed-By:)' /etc/apt/sources.list /etc/apt/sources.list.d 2>/dev/null
ls -lah /etc/apt/sources.list.d/فقط فایل مربوط به دامنه خطادار را بررسی کنید. برای مخازن رسمی Ubuntu، مقدار Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg در فایل ubuntu.sources معمول است؛ آن را با کلید یک سرویس شخص ثالث جایگزین نکنید. اگر مخزن دیگر استفاده نمیشود، غیرفعالکردن همان ورودی از افزودن کلید جدید امنتر است.
مرحله ۳: کلید را فقط از ناشر رسمی بگیرید و Fingerprint را تأیید کنید
ابتدا در وبسایت رسمی سازنده مخزن، URL دریافت کلید و اثر انگشت کامل (Fingerprint) آن را پیدا کنید. این دو مقدار باید مستقل از متن خطای APT و از مسیر قابل اعتماد ناشر تأیید شوند. آدرس نمونه زیر واقعی نیست؛ قبل از اجرا حتماً با URL رسمی ناشر جایگزین شود.
KEY_URL='https://vendor.example/path/to/official-signing-key.asc'
curl -fL --proto '=https' --tlsv1.2 "$KEY_URL" -o /tmp/vendor-key.asc
gpg --show-keys --with-fingerprint /tmp/vendor-key.ascاگر Fingerprint با مستندات رسمی مطابقت ندارد، عملیات را متوقف کنید. شناسه کوتاه نمایشدادهشده در NO_PUBKEY جایگزین بررسی Fingerprint کامل نیست. از apt-key adv --recv-keys برای اعتماد سراسری به کلید ناشناخته استفاده نکنید.
مرحله ۴: Keyring محدود به همان مخزن بسازید
پس از تطبیق Fingerprint، برای کلید شخص ثالث یک فایل مستقل در /etc/apt/keyrings بسازید. نام vendor را مطابق نام ناشر انتخاب کنید؛ این نمونه فقط پس از تأیید منبع قابل اجراست.
sudo install -d -m 0755 /etc/apt/keyrings
gpg --dearmor --yes -o /tmp/vendor-archive-keyring.gpg /tmp/vendor-key.asc
sudo install -m 0644 /tmp/vendor-archive-keyring.gpg /etc/apt/keyrings/vendor-archive-keyring.gpg
gpg --show-keys --with-fingerprint /etc/apt/keyrings/vendor-archive-keyring.gpgفایل کلید باید برای کاربر سیستمی _apt قابل خواندن باشد. /usr/share/keyrings معمولاً برای Keyringهای مدیریتشده توسط بستهها و /etc/apt/keyrings برای کلیدهایی است که مدیر سیستم مدیریت میکند.
مرحله ۵: Signed-By را در فایل مخزن تنظیم کنید
حالت deb822 در فایل .sources
فایل .sources مربوط به همان مخزن را با ویرایشگر باز کنید و خط Signed-By را به Keyring تأییدشده ارجاع دهید. این مثال قالب است، نه یک مخزن واقعی؛ مقدارهای URI، Suite و Component باید با راهنمای رسمی ناشر مطابقت داشته باشند:
Types: deb
URIs: https://repo.vendor.example/ubuntu
Suites: noble
Components: main
Signed-By: /etc/apt/keyrings/vendor-archive-keyring.gpgحالت قدیمی .list
در فایل .list همان مخزن، گزینه signed-by را داخل براکت خط deb قرار دهید. noble فقط نام کد Ubuntu 24.04 است؛ برای نسخه دیگر مقدار صحیح را از مستندات ناشر بگیرید.
deb [signed-by=/etc/apt/keyrings/vendor-archive-keyring.gpg] https://repo.vendor.example/ubuntu noble mainنکته امنیتی: کلید را به مخازن نامرتبط تعمیم ندهید و گزینههای trusted=yes، allow-insecure=yes یا Acquire::AllowInsecureRepositories=true را برای دورزدن خطا فعال نکنید؛ این کار حفاظت امضای مخزن را تضعیف میکند.
مرحله ۶: رفع خطا را Verify کنید
sudo apt update
apt-cache policy
sudo grep -RnsE '^(deb |URIs:|Signed-By:)' /etc/apt/sources.list /etc/apt/sources.list.d 2>/dev/nullدر خروجی موفق، برای مخزن اصلاحشده دیگر NO_PUBKEY نباید نمایش داده شود و فهرست بستههای همان مخزن بدون هشدار امضای نامعتبر دریافت میشود. خروجی apt-cache policy میتواند اولویت و منبع بستهها را نشان دهد. اگر خطای دیگری باقی ماند، متن جدید را جداگانه بررسی کنید؛ رفع یک کلید به معنی سالمبودن همه مخازن نیست.
اگر NO_PUBKEY برای مخازن رسمی Ubuntu رخ میدهد
در این حالت بهجای دریافت کلید از وبسایتهای ناشناس، ابتدا وجود ubuntu-keyring و مسیر Keyring رسمی را بررسی کنید:
dpkg-query -W ubuntu-keyring
ls -l /usr/share/keyrings/ubuntu-archive-keyring.gpg
cat /etc/apt/sources.list.d/ubuntu.sources 2>/dev/nullاگر بسته یا Keyring رسمی خراب یا حذف شده، بازگردانی آن باید از بسته معتبر و امضاشده توزیع، رسانه نصب قابل اعتماد یا مسیر بازیابی کنترلشده انجام شود؛ دانلود فایل تصادفی و واردکردن کلید ناشناس توصیه نمیشود. همچنین Suite مخزن باید با نسخه نصبشده هماهنگ باشد.
خطاهای رایج: EXPKEYSIG، Signed-By conflict و BADSIG
EXPKEYSIG را با دستور دریافت کلید جدید از سایت رسمی ناشر و بررسی دوره اعتبار آن پیگیری کنید. Conflicting values set for option Signed-By معمولاً از تعریف تکراری یک مخزن با Keyringهای متفاوت ناشی میشود؛ فایلهای .list و .sources را بررسی و فقط ورودی تکراری را اصلاح کنید. BADSIG را با اعتمادسازی کورکورانه دور نزنید؛ احتمال خرابی دانلود، Mirror ناسازگار یا مسئله امنیتی را بررسی کنید.
روی VPS چه زمانی انتخاب زیرساخت اهمیت پیدا میکند؟
برای سرور لینوکسی خودمدیریت، توانایی دسترسی sudo/root، کنسول بازیابی و تهیه Snapshot یا بکاپ قبل از تغییر مخازن در مدیریت ریسک مهم است. هنگام انتخاب زیرساخت میتوانید پلنهای سرور مجازی وانسرور را از نظر سطح دسترسی مدیریتی و امکانات قابل تأیید مقایسه کنید؛ خرید VPS جدید بهخودیخود خطای NO_PUBKEY سیستم فعلی را برطرف نمیکند. اگر پس از اصلاح مخازن میخواهید سیستم را امن نگه دارید، راهنمای امنسازی SSH روی VPS لینوکس نیز مکمل مناسبی است.
Rollback: اگر تنظیم Signed-By اشتباه شد چه کنیم؟
اگر پس از تغییر، APT خطای جدید داد، فایل مخزن و Keyring را بدون پاککردن فایلهای رسمی Ubuntu با نسخه پشتیبان همان سرور مقایسه کنید. فقط فایل .sources یا .list مربوط به ناشر را از بکاپ اولیه برگردانید و دوباره sudo apt update بزنید. فایل Keyring جدید را فقط پس از اطمینان از اینکه هیچ مخزن دیگری از آن استفاده نمیکند حذف کنید. هرگز برای عبور از خطا، احراز امضا را غیرفعال نکنید.
مرجع فنی: راهنمای رسمی apt-secure اوبونتو، مستندات sources.list و Signed-By و مدیریت بستهها در Ubuntu Server.