وبلاگ نت‌آرامآموزش، تجربه و راهکارهای زیرساخت

رفع خطای Conflicting values for Signed-By در apt اوبونتو

آموزش پیدا کردن ورودی‌های ناسازگار مخزن در فایل‌های list و deb822 sources و اصلاح امن مسیر کلید APT.

انتشار:
توسط تیم فنی نت‌آرام
۷ دقیقه زمان مطالعه
۰ دیدگاه
محتوای تخصصی، ساده و کاربردی
هماهنگ با هویت حرفه‌ای نت‌آرام
بازگشت به لیست مقالات
تصویر شاخص مقاله رفع خطای Conflicting values for Signed-By در apt اوبونتو در وبلاگ نت‌آرام
محتوای آموزشی وبلاگ نت‌آرام
هنگام اجرای apt update پیام Conflicting values set for option Signed-By را می‌بینید و APT نمی‌تواند فهرست مخزن‌ها را بخواند. معمولاً یک مخزن با آدرس و نسخه یکسان بیش از یک بار تعریف شده، اما یکی از تعریف‌ها به فایل کلید متفاوتی اشاره می‌کند. برای نمونه، ممکن است یک فایل قدیمی .list و یک فایل جدید .sources هر دو تنظیم Docker را داشته باشند.
Signed-By تعیین می‌کند APT برای تأیید امضای مخزن به کدام کلید اعتماد کند. حذف همه کلیدها یا غیرفعال کردن بررسی امضا درمان امنی نیست. در این راهنما دو ورودی را پیدا می‌کنیم، تفاوتشان را می‌فهمیم و فقط تنظیم تکراری یا اشتباه را اصلاح می‌کنیم.
دسترسی SSH و sudo لازم است. نام مخزن Docker در این راهنما یک مثال است؛ اگر پیام شما به مخزن دیگری اشاره دارد، همان نام و مستند سازنده خودتان را استفاده کنید. فایل‌های مخزن ممکن است آدرس یا اطلاعات خصوصی داشته باشند؛ محتوا را بدون حذف اطلاعات حساس در تیکت منتشر نکنید.

۱. آدرس و دو مقدار ناسازگار را یادداشت کنید

کد / دستورsudo apt-get update
در خط خطا، نشانی مخزن، suite و مقدارهای دو طرفِ علامت ناسازگاری را بخوانید. یکی ممکن است مسیر یک فایل کلید و دیگری مسیر متفاوت یا مقدار خالی باشد. اگر به جای این پیام EXPKEYSIG می‌بینید، مسئله انقضای کلید است؛ راهنمای کلید منقضی APT را دنبال کنید.
نسخه Ubuntu را ببینید تا نام suite مناسب و مستند مربوط را پیدا کنید:
کد / دستورcat /etc/os-release
مثلاً noble یا jammy نام نسخه مخزن است. نام واقعی سیستم شما می‌تواند متفاوت باشد؛ بدون بررسی، suite مخزن را به نام نسخه دیگری تغییر ندهید.

۲. کدام فایل‌ها این مخزن را تعریف کرده‌اند؟

در مثال Docker، این دستور فقط نام فایل‌هایی را نشان می‌دهد که نشانی مخزن در آن‌ها آمده است:
کد / دستورsudo grep -R -l -F 'download.docker.com/linux/ubuntu' /etc/apt/sources.list /etc/apt/sources.list.d/ 2>/dev/null
اگر مخزن دیگری در خطا دیده‌اید، عبارت جست‌وجو را با نشانی پایه همان مخزن عوض کنید. ممکن است خروجی علاوه بر فایل‌های فعال، نسخه‌های پشتیبان یا فایل غیرفعال را نیز نشان دهد؛ معمولاً APT فایل‌های .list و .sources معتبر را به‌عنوان تنظیم منبع می‌خواند. نام فایل به‌تنهایی نشان نمی‌دهد هر خط آن فعال است.
فرض کنیم دو فایل فعال پیدا شده‌اند:
کد / دستور/etc/apt/sources.list.d/docker.list /etc/apt/sources.list.d/docker.sources
فایل اول می‌تواند خطی شبیه این داشته باشد:
کد / دستورdeb [signed-by=/usr/share/keyrings/docker-old.gpg] https://download.docker.com/linux/ubuntu noble stable
و فایل دوم به شکل جدید deb822:
کد / دستورTypes: deb URIs: https://download.docker.com/linux/ubuntu Suites: noble Components: stable Signed-By: /etc/apt/keyrings/docker.asc
این‌ها فقط برای توضیح‌اند؛ محتوا و مسیر واقعی سرور شما ممکن است فرق کند. آدرس پایه، suite، نوع deb یا deb-src، component، معماری و مقدار Signed-By را مقایسه کنید. چند ورودی مربوط به componentها یا کد منبع ممکن است عمداً لازم باشند؛ هر تکراری را بدون فهمیدن تفاوت‌ها حذف نکنید.

۳. پیش از ویرایش، نسخه پشتیبان بگیرید

اگر دو فایل واقعی شما همان دو مسیر نمونه‌اند، یک پوشه تازه و محدود در home مدیر بسازید:
کد / دستورbackupdir=$(sudo mktemp -d /root/apt-sources-save.XXXXXXXX)
اگر دستور خطا داد یا مقدار خالی بود، ادامه ندهید. سپس فقط فایل‌هایی را که قرار است ویرایش کنید با مسیر واقعی کپی کنید:
کد / دستورsudo cp -a /etc/apt/sources.list.d/docker.list "$backupdir"/ sudo cp -a /etc/apt/sources.list.d/docker.sources "$backupdir"/
مسیر بکاپ را برای برگشت یادداشت کنید:
کد / دستورprintf '%s\n' "$backupdir"
این پوشه بیرون از sources.list.d است، پس فایل بکاپ به‌عنوان منبع فعال خوانده نمی‌شود. اگر فقط یکی از فایل‌ها را تغییر می‌دهید، همان را پشتیبان بگیرید. فایل کلید خصوصی یا رمز را در اختیار دیگران نگذارید.

۴. حالت اول: یک ورودی واقعاً تکراری و قدیمی است

اگر تأیید کرده‌اید فایل docker.sources همه موارد لازم را پوشش می‌دهد و خط docker.list فقط نسخه قدیمی همان منبع است، می‌توانید همان خط فایل قدیمی را غیرفعال کنید. فایل را باز کنید:
کد / دستورsudo nano /etc/apt/sources.list.d/docker.list
در ابتدای خط تکراری یک # بگذارید:
کد / دستور# deb [signed-by=/usr/share/keyrings/docker-old.gpg] https://download.docker.com/linux/ubuntu noble stable
در nano با Ctrl+O و Enter ذخیره و با Ctrl+X خارج شوید. دیگر خطوط مفید همان فایل را بدون بررسی تغییر ندهید. اگر تنظیم تکراری در یک stanza از فایل .sources است، در همان stanza می‌توان Enabled: no قرار داد؛ یک فایل deb822 ممکن است چند stanza داشته باشد و غیرفعال کردن کل فایل ممکن است منابع دیگر را هم حذف کند.
این روش تنها وقتی درست است که تعریف باقی‌مانده واقعاً از نظر suite، معماری و component نیاز شما را پوشش دهد. اگر شک دارید، به جای حذف شتاب‌زده سراغ مقایسه دقیق بروید.

۵. حالت دوم: هر دو ورودی لازم‌اند اما کلیدها فرق دارند

گاهی دو ورودی برای همان URI و suite، component یا نوع متفاوتی دارند و هر دو لازم‌اند. در این حالت مقدار Signed-By باید طبق قواعد APT و مستند سازنده برای آن منبع سازگار باشد. ابتدا مسیر رسمی و فایل کلید درست را تأیید کنید؛ برای Docker، راهنمای رسمی نصب روی Ubuntu مسیر و روش فعلی را نشان می‌دهد.
اگر مستند سازنده می‌گوید هر دو ورودی باید از /etc/apt/keyrings/docker.asc استفاده کنند و فایل معتبر وجود دارد، خط .list را با همان مسیر صحیح و دیگر گزینه‌های لازم ویرایش کنید:
کد / دستورdeb [signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu noble stable
در فایل .sources مقدار معادل به صورت Signed-By: /etc/apt/keyrings/docker.asc نوشته می‌شود. suite و گزینه‌های معماری را از تنظیم واقعی خود نگه دارید. صرف یکسان نوشتن دو نام، اعتبار خود کلید را ثابت نمی‌کند. فایل .asc و keyring باینری .gpg نیز فرمت‌های متفاوتی دارند؛ محتوای یکی را با تغییر پسوند به دیگری تبدیل نکنید.
وجود و قابلیت خواندن کلید نمونه را ببینید:
کد / دستورsudo ls -l /etc/apt/keyrings/docker.asc کد / دستورsudo -u _apt test -r /etc/apt/keyrings/docker.asc && echo 'key is readable'
اگر پیام دوم دیده نشد، فایل، مجوزهای مسیر و کاربر _apt را بررسی کنید. این آزمون فقط قابلیت خواندن را می‌سنجد، نه اصالت کلید. اصالت و اثرانگشت را از منبع معتبر سازنده بررسی کنید.

۶. دوباره به‌روزرسانی و نتیجه را بررسی کنید

کد / دستورsudo apt-get update
پیام Conflicting values برای آن مخزن باید حذف شود. ممکن است پس از حل این خطا، مشکل جداگانه‌ای مثل NO_PUBKEY، کلید منقضی یا اتصال شبکه نمایان شود؛ آن را بر اساس پیام تازه حل کنید، نه با trusted=yes یا غیرفعال کردن احراز امضا.
برای دیدن منبع و نسخه پیشنهادی یک بسته نمونه Docker:
کد / دستورapt-cache policy docker-ce
اگر از Docker استفاده نمی‌کنید، نام بسته مربوط به مخزن خود را جایگزین کنید. وجود یک Candidate و منبع درست کمک می‌کند مطمئن شوید منبع موردنظر هنوز در تنظیمات هست، اما نصب موفق برنامه را به‌تنهایی ثابت نمی‌کند.
اگر پس از تغییر، یک منبع لازم ناپدید شد یا اشتباه کردید، نسخه پشتیبان را به مسیر درست بازگردانید. برای مثال فقط اگر بکاپ مرحله قبل را تأیید کرده‌اید:
کد / دستورsudo cp -a "$backupdir/docker.list" /etc/apt/sources.list.d/docker.list
اگر فایل دیگر را هم تغییر داده‌اید، بکاپ مربوط به همان فایل را برگردانید. سپس sudo apt-get update را دوباره اجرا کنید. برگشت به تنظیم قبلی ممکن است همان خطای اولیه را برگرداند، اما مانع از باقی ماندن تغییر اشتباه می‌شود.
این روش در Ubuntu روی سرور مجازی ایران و سرور اختصاصی ایران کاربرد دارد. جزئیات دو قالب و گزینه Signed-By در مستند sources.list اوبونتو آمده است.
اشتراک‌گذاری:
لینکدینتلگرامایکس
مقاله قبلی
مقاله قبلی وجود ندارد.

دیدگاه‌ها (۰)

دیدگاه‌های تاییدشده و پاسخ‌های تیم نت‌آرام