آنچه در این مقاله میخوانید
حل مشکل افزودن مخازن خارجی در اوبونتو 22.04 با gpg
۹ اسفند ۱۴۰۳
دستورات apt-key و add-apt-repository ابزارهایی هستند که برای مدیریت کلیدها و افزودن مخازن خارجی به سیستم APT در اوبونتو استفاده میشوند، اما این کلیدها بهصورت جهانی مورد اعتماد قرار میگیرند که ممکن است مشکلات امنیتی به همراه داشته باشد. از نسخه 20.10 اوبونتو، هشدارهایی مبنی بر منسوخ شدن این ابزارها داده شده و توصیه میشود از gpg به جای آنها استفاده شود. gpg بهطور مستقیم عمل میکند و بهطور کامل با نسخههای قدیمیتر اوبونتو سازگار است. در این آموزش دو روش جایگزین برای استفاده از apt-key و add-apt-repository را توضیح خواهیم داد:
اولین روش افزودن مخزن خارجی با استفاده از کلید عمومی از طریق gpg بهجای استفاده از apt-key است و روش دوم افزودن مخزن خارجی با استفاده از keyserver و gpg بهجای add-apt-repository میباشد.
آنچه در این مقاله خواهید خواند:
- مرحله اول: شناسایی فرمت و اجزای کلید
- مرحله دوم: دانلود کلید و تبدیل آن به فرمت سازگار با apt
- مرحله سوم: اضافه کردن مخزن به لیست پکیجها
- مرحله چهارم: نصب بسته از مخزن خارجی
- مرحله پنجم: اضافه کردن مخزن از Keyserver
- جمع بندی
مطالب پیشنهادی: نحوه راهاندازی اولیه سرور مجازی با اوبونتو Ubuntu

مرحله اول: شناسایی فرمت و اجزای کلید
PGP یک برنامه رمزنگاری اختصاصی است که برای امضا، رمزگذاری و رمزگشایی فایلها و دایرکتوریها استفاده میشود. این فایلها برای تأیید مخازن بهعنوان منابع معتبر در apt کاربرد دارند. GPG جایگزین متنباز PGP است که معمولاً بهصورت keyring استفاده میشود. این دو فرمت معمولاً برای امضا و رمزگذاری فایلها بهکار میروند.
ابزار خط فرمان gpg برای تأیید مخازن خارجی در apt استفاده میشود. با این حال، gpg تنها از فایلهای GPG پشتیبانی میکند و برای استفاده از فایلهای PGP، باید آنها را به فرمت قابل قبول تبدیل کنید.
در این مرحله، مثالی از Elasticsearch میزنیم که در آن، یک کلید PGP دریافت شده و با استفاده از دستور gpg و سوئیچ --dearmor به فرمت apt تبدیل میشود. سپس، آدرس مخزن به لیست منابع بسته اضافه میشود و کلید تبدیلشده بهطور مستقیم به آن ارجاع داده میشود. در آخر، با نصب بسته Elasticsearch، این فرایند تأیید میشود.
در ادامه، باید مشخص کنید که آیا فایل کلید دریافتی شما در فرمت PGP است یا GPG!
برای اینکار میتوانید فایل کلید را با دستور curl باز کرده و محتوای آن را ببینید:
curl -fsSL https://artifacts.elastic.co/GPG-KEY-elasticsearch
Output
-----BEGIN PGP PUBLIC KEY BLOCK-----
. . .
همانطور که میبینید، باوجود اینکه در URL به GPG اشاره شده است، خط اول نشان میدهد که این فایل در واقع یک فایل PGP است. دقت کنید که apt فقط از فرمت GPG پشتیبانی میکند.
مرحله دوم: دانلود کلید و تبدیل آن به فرمت سازگار با apt
در این مثال، برای Elasticsearch ابتدا یک فایل PGP را دانلود کنید که باید بعد از دانلود، آن را به فرمت GPG تبدیل کنید. برای این کار، از دستور curl برای دانلود کلید استفاده میشود و سپس خروجی دانلود شده به دستور gpg منتقل میشود. با استفاده از پارامتر --dearmor، فایل PGP به فرمت GPG تبدیل میشود تا بتوانید آن را در سیستم خود بهطور مناسب استفاده کنید.
در اوبونتو، مسیر /usr/share/keyrings جایی برای ذخیره فایلهای GPG در نظر گرفته شده است، زیرا این مسیر پیشفرض برای ذخیره keyringها است. در این مثال، نام فایل elastic-7.x.gpg است:
curl -fsSL https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo gpg --dearmor -o /usr/share/keyrings/elastic-7.x.gpg
دقت کنید که این دستور فایل PGP را به فرمت درست GPG تبدیل کرده و آماده لیست شدن در منابع apt میشود.
مرحله سوم: اضافه کردن مخزن به لیست پکیجها
در این مرحله، پس از دانلود و تبدیل کلید به فرمت GPG، میتوانید مخزن را به منابع پکیجهای apt در اوبونتو اضافه کنید. apt پکیجها را از سه منبع اصلی دریافت میکند: فایل اصلی sources.list، فایلهای .list موجود در دایرکتوری sources.list.d، و فایلهای .source در همان دایرکتوری.
حالت اول: افزودن مستقیم به فایل sources.list
در این روش، میتوانید مخزن را مستقیماً به فایل اصلی sources.list اضافه کنید. این فایل در مسیر /etc/apt/sources.list قرار دارد و محل اصلی برای مدیریت منابع پکیجها است. پس از افزودن آدرس مخزن و کلید GPG، apt از این فایل برای دسترسی به منابع پکیجها استفاده میکند.
حالا برای ویرایش فایل /etc/apt/sources.list، میتوانید از ویرایشگر متنیnano استفاده کنید. برای باز کردن فایل با nano، دستور زیر را در ترمینال وارد کنید:
sudo nano /etc/apt/sources.list
بعد از اضافه کردن مخزن زیر، فایل را ذخیره کرده و ویرایشگر را ببندید.
deb [arch=amd64,arm64 signed-by=/usr/share/keyrings/elastic-7.x.gpg] https://artifacts.elastic.co/packages/7.x/apt stable main
خط بالا شامل موارد زیر در مورد مخزن است:
deb:مخزن از معماری Debian معمولی استفاده میکند.arch=amd64,arm64: این گزینه معماریهایی را که دادههای APT برای آنها دانلود میشود، مشخص میکند. مانند amd64 و arm64.signed-by=/usr/share/keyrings/elastic-7.x.gpg: این قسمت مشخص میکند که برای تأییدمخزن از کدام کلید استفاده شود. در اینجا، به فایل.gpgدر مسیر/usr/share/keyrings/اشاره میکند. این تغییر، کلید را به مخزن خاصی مرتبط میکند و نقص امنیتیapt-keyرا رفع میکند.https://artifacts.elastic.co/packages/7.x/apt stable main: این URI محل دقیق دادههای موجود در مخزن را نشان میدهد./etc/apt/sources.list.d/elastic-7.x.list: این آدرس، محل و نام فایل جدیدی است که باید ایجاد شود./dev/null: این مورد زمانی استفاده میشود که خروجی یک دستور ضروری نباشد. اشاره کردن به این مسیر خروجی را حذف میکند.
در نهایت، برای ذخیره تغییرات و خروج از ویرایشگر، از دستور CTRL+O برای ذخیره و CTRL+X برای خروج استفاده کنید.
پیشنهاد مطالعه: آشنایی با خط فرمان لینوکس
حالت دوم: ایجاد یک فایل جدید .list در sources.list.d
در این روش، به جای ویرایش مستقیم sources.list، یک فایل جداگانه در sources.list.d ایجاد میشود. این کار باعث میشود مدیریت مخازن راحتتر باشد و در صورت نیاز، بتوانید مخزن موردنظرخود را بدون تغییر در فایل اصلی حذف یا ویرایش کنید.
حالا برای اینکار کافی است دستور echo را به کمک tee اجرا کنید تا فایل جدیدی ایجاد شود، سپس خط مربوط به مخزن را در آن ذخیره کنید. در مثال زیر، نام فایل elastic-7.x.list میباشد:
echo "deb [arch=amd64,arm64 signed-by=/usr/share/keyrings/elastic-7.x.gpg] https://artifacts.elastic.co/packages/7.x/apt stable main" | sudo tee /etc/apt/sources.list.d/elastic-7.x.list > /dev/null
این دستور کار ایجاد دستی فایل و اضافه کردن مخزن را خیلی سریعتر و سادهتر انجام میدهد.
حالت سوم: ایجاد یک فایل .sources در sources.list.d
در روش آخر بجای اینکه از فایلهای .list استفاده کنیم، فایلهای .sources را برای اضافه کردن مخازن انتخاب میکنیم. فایلهای .sources از فرمت deb822 استفاده میکنند که نسبت به فرمت معمولی deb شفافتر است. با اینحال از لحاظ عملکرد، تفاوتی بین این دو فرمت وجود ندارد. در ادامه، برای ایجاد یک فایل .sources دستور زیر را وارد کنید:
sudo nano /etc/apt/sources.list.d/elastic-7.x.sources
پس از ایجاد فایل، مخزن خارجی را با فرمت خاص deb822 اضافه کنید:
Types: deb
Architectures: amd64 arm64
Signed-By: /usr/share/keyrings/elastic-7.x.gpg
URIs: https://artifacts.elastic.co/packages/7.x/apt
Suites: stable
Components: main
در آخر بعد از وارد کردن متن بالا، فایل را ذخیره کرده و از ویرایشگر خارج شوید.
حالا که مخازن را تنظیم کردهاید، یک نصب آزمایشی انجام دهید تا مطمئن شوید که مخازن به درستی اضافه شدهاند.
مرحله چهارم: نصب بسته از مخزن خارجی
برای اینکه apt مخازن جدید شما را بررسی کند، دستور apt update را اجرا کنید. اگر بدون اجرای این دستور، دستور apt install را بزنید، ممکن است نصب بسته با خطا مواجه شود یا بستهی قدیمی از مخازن پیشفرض نصب شود.
بنابراین برای بروزرسانی مخازن این دستور را بزنید:
sudo apt update
سپس بسته موردنظرتان را نصب کنید:
sudo apt install elasticsearch
بعد از اجرای این دستورات، نصب بسته بهطور کامل انجام شده و آماده استفاده خواهد بود.
مرحله پنجم: اضافه کردن مخزن از Keyserver
add-apt-repository و apt-key هر دو ابزارهایی برای اضافه کردن مخازن و کلیدهای امنیتی در سیستمهای مبتنی بر دبیبان هستند. add-apt-repository نسخهای است که از keyserver برای دانلود کلیدهای عمومی استفاده میکند، در حالی که apt-key برای اضافه کردن کلیدهای امنیتی به مخازن سیستم طراحی شده بود. این دو ابزار در حال منسوخ شدن هستند و بهزودی دیگر بهطور رسمی پشتیبانی نمیشوند.
در این روش جدید، بهجای اینکه مستقیماً یک کلید و مخزن را وارد کنید، شما یک آدرس keyserver (سرور کلید) و شناسه کلید دریافت میکنید. در این سناریو، شما میتوانید کلید موردنظر را مستقیماً از سرور کلید دانلود کنید و آن را در فرمت .gpg مناسب ذخیره کنید. این یعنی نیازی به تبدیل فرمت یا اضافه کردن دستی کلید به یک keyring موجود نخواهید داشت.
برای اضافه کردن مخزن خارجی، ابتدا باید با دستور gpg کلید را مستقیما از keyserver دانلود کنید، البته بسته به حجم ترافیک دانلود، این دستور ممکن است کمی زمان ببرد.
sudo gpg --homedir /tmp --no-default-keyring --keyring /usr/share/keyrings/R.gpg --keyserver keyserver.ubuntu.com --recv-keys E298A3A825C0D65DFD57CBB651716619E084DAB9
دستور بالا شامل برخی فلگها است که تفاوتهایی با استفاده از gpg با یک کلید عمومی دارند:
--no-default-keyringهمراه با--keyring: این ترکیب به شما اجازه میدهد که کلید را به یک فایل جدید خروجی بدهید، به جای اینکه آن را درkeyringموجود وارد کنید. این برخلاف رفتار پیشفرضgpgاست که معمولاً کلید را بهkeyringموجود اضافه میکند.--keyserverهمراه با--recv-keys: این ترکیب مشخص میکند که از کدام سرور کلید و کدام کلید را دانلود میکنید. شما باید آدرس سرور و شناسه کلید را وارد کنید تاgpgبتواند کلید مربوطه را از سرور دریافت کند.--homedir: این فلگ برای تغییر مکان پیشفرضgpgدر ساخت فایلهای موقت استفاده میشود. بهطور پیشفرض،gpgسعی میکند این فایلها را در دایرکتوری/rootبسازد، که ممکن است خطای دسترسی به علت مشکلات مجوزها ایجاد کند. با استفاده از--homedir، فایلهای موقت در مسیر مناسب مانند/tmpذخیره میشوند تا از بروز مشکلات جلوگیری شود.
با استفاده از این فلگها میتوانید کلید را بهطور ایمن و درست از سرور کلید دریافت کرده و آن را به فایلهای مورد نظر خود ذخیره کنید.
بعد از دانلود کلید، باید مخزن را به یک فایل .list اضافه کنید. این کار دقیقا شبیه روش اضافه کردن مخزن خارجی با استفاده از کلید عمومی است که در مراحل بالا مشاهده کردید.
برای اینکار دستور زیر را وارد کنید:
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/R.gpg] https://cloud.r-project.org/bin/linux/ubuntu jammy-cran40/" | sudo tee /etc/apt/sources.list.d/R.list > /dev/null
در ادامه مخازن را بروزسانی کنید:
sudo apt update
در آخر بسته موردنظر خود را نصب کنید:
sudo apt install r-base
جمع بندی
تبریک! شما با موفقیت، مخازن خارجی را روی اوبونتو نصب کردید. حالا برای اینکه مطمئن شوید مخازن نصب شدهاند، یک نصب آزمایشی انجام دهید، کافیست دستور apt update را وارد کرده و سپس بسته مورد نظر خود را apt install نصب کنید.
سوالات متداول
1- چه تفاوتی بین استفاده از کلید عمومی و استفاده از سرور کلید (keyserver) برای افزودن مخازن وجود دارد؟
در استفاده از کلید عمومی، کلید بهطور مستقیم از یک فایل یا URL دانلود میشود و به keyring سیستم اضافه میشود. در حالی که در استفاده از سرور کلید، کلید از یک سرور کلید از راه دور دانلود شده و به keyring سیستم اضافه میشود. سرور کلید معمولاً از شناسه کلید و آدرس سرور استفاده میکند.
2- چرا باید از دستور --no-default-keyring در هنگام دانلود کلید با gpg استفاده کنیم؟
دستور --no-default-keyring به gpg میگوید که از keyring پیشفرض استفاده نکند و بهجای آن، یک keyring خاص که مسیر آن تعیین شده است، برای ذخیره کلید جدید استفاده کند. این کار کمک میکند تا از تغییرات غیرمجاز در keyring پیشفرض جلوگیری شود.
3-چرا هنگام افزودن مخازن با gpg باید از دستور --signed-by استفاده کنیم؟
دستور --signed-by به gpg میگوید که برای تأیید مخزن از کدام کلید استفاده شود. این کلید بهطور خاص برای تایید امضای مخزن استفاده میشود و به apt کمک میکند تا از صحت مخزن مطمئن شود.
4-چگونه میتوانم مخازن خارجی را پس از اضافه کردن، حذف یا ویرایش کنم؟
برای حذف یا ویرایش یک مخزن خارجی، به راحتی میتوانید فایل .list یا .sources مربوطه را در دایرکتوری /etc/apt/sources.list.d/ ویرایش یا حذف کنید. برای ویرایش از یک ویرایشگر متن مثل nano یا vim استفاده کنید.
5-آیا میتوانم از کلیدهای متفاوت برای مخازن مختلف استفاده کنم؟
بله، شما میتوانید برای هر مخزن یک کلید جداگانه استفاده کنید. در این حالت، باید از دستور --signed-by برای مشخص کردن کلید مرتبط با هر مخزن استفاده کنید تا apt بتواند هر مخزن را با کلید خاص خود تأیید کند.